package softbus
|
|
import (
|
"fmt"
|
"time"
|
|
"github.com/golang/protobuf/proto"
|
)
|
|
const (
|
// HeartbeatKey fixed key for hb to servermanager
|
HeartbeatKey = 11
|
// RegKey fixed key for hb to servermanager
|
RegKey = 12
|
// UpKey fixed key for update topic to servermanager
|
UpKey = 13
|
// GetTopicInfoTypeTopic topic
|
GetTopicInfoTypeTopic = "gettopic"
|
// GetTopicInfoTypeChannel channel
|
GetTopicInfoTypeChannel = "getchannel"
|
)
|
|
type shmKeyAndProcInfo struct {
|
sock *DgramSocket
|
info *ProcInfo
|
}
|
|
// Handle handler
|
type Handle struct {
|
m map[string]*shmKeyAndProcInfo
|
sockWorker *DgramSocket
|
}
|
|
// Register reg
|
func Register(info *RegisterInfo) *Handle {
|
m := make(map[string]*shmKeyAndProcInfo)
|
|
// 首先请求一堆key
|
sockReg := OpenDgramSocket()
|
if sockReg == nil {
|
return nil
|
}
|
var msg, rdata []byte
|
var err error
|
for {
|
if msg == nil {
|
if msg, err = proto.Marshal(info); err != nil {
|
time.Sleep(100 * time.Millisecond)
|
continue
|
}
|
}
|
if rdata, err = sockReg.SendAndRecv(msg, RegKey); err == nil {
|
break
|
}
|
time.Sleep(100 * time.Millisecond)
|
}
|
sockReg.Close()
|
// 得到key,赋值
|
if rdata != nil {
|
|
}
|
// 只收不发
|
for _, v := range info.Channel {
|
s := OpenDgramSocket()
|
m[v] = &shmKeyAndProcInfo{
|
sock: s,
|
info: info.ProcInfo,
|
}
|
}
|
|
// pub/sub使用同一个socket
|
pbs := OpenDgramSocket()
|
for _, v := range info.PubTopic {
|
m[v] = &shmKeyAndProcInfo{
|
sock: pbs,
|
info: info.ProcInfo,
|
}
|
}
|
for _, v := range info.SubTopic {
|
m[v] = &shmKeyAndProcInfo{
|
sock: pbs,
|
info: info.ProcInfo,
|
}
|
}
|
|
s := OpenDgramSocket()
|
return &Handle{
|
m: m,
|
sockWorker: s,
|
}
|
}
|
|
// GetTopicInfo get topic info
|
func (h *Handle) GetTopicInfo(topic, typ string) int {
|
if v, ok := h.m[topic]; ok {
|
return v.sock.Port()
|
}
|
return -1
|
}
|
|
func (h *Handle) send2(data []byte, key int, logID string) error {
|
if r := h.sockWorker.SendTo(data, key); r != 0 {
|
return fmt.Errorf("%s SendTo Failed: %d", logID, r)
|
}
|
return nil
|
}
|
|
// HeartBeat hb
|
func (h *Handle) HeartBeat(info *HeartbeatInfo) error {
|
msg, err := proto.Marshal(info)
|
if err == nil {
|
return h.send2(msg, HeartbeatKey, "HeartBeat")
|
}
|
return err
|
}
|
|
// SendOnly no recv
|
func (h *Handle) SendOnly(key int, info *MsgInfo) error {
|
msg, err := proto.Marshal(info)
|
if err == nil {
|
return h.send2(msg, key, "SendOnly/Pub")
|
}
|
return err
|
}
|
|
// Pub func
|
func (h *Handle) Pub(info *MsgInfo) error {
|
// return h.SendOnly(PubKey, info)
|
return nil
|
}
|