Files
2022-07-28 21:06:08 +08:00

72 lines
1.8 KiB
Go

package main
import (
"fmt"
"log"
"minlib/component"
"minlib/logicface"
"minlib/packet"
)
type DemoServer struct {
mFace logicface.LogicFace // 用于跟MIR进行通信的logic face
receivePacketQue chan *packet.Interest // 从客户端收包后,放入该队列
state bool // 程序生成状态, true 为正常运行, false 为关闭状态
srcIdentifier *component.Identifier // 源地址
}
func (s *DemoServer) Init() {
s.receivePacketQue = make(chan *packet.Interest, 10000)
s.state = true
}
func (s *DemoServer) Start() error {
// 通过 Unix 通道连接MIR
err := s.mFace.InitWithUnixSocket(UnixSockPath)
if err != nil {
log.Fatal(err)
}
// 注册前缀
s.srcIdentifier, err = component.CreateIdentifierByString(VpnServerPrefix)
if err != nil {
log.Fatal(err)
}
err = s.mFace.RegisterIdentifier(s.srcIdentifier, 2000)
if err != nil {
log.Fatal(err)
}
log.Println("listen on pull prefix : ", VpnServerPrefix)
// 启动处理接收到的包的协程
for i := 0; i < 4; i++ {
go s.dealWithRecvPktRoutine()
}
// 启动从客户端接收包的协程
s.recvPacketFromClientRoutine()
return nil
}
//
// @Description: 使用一个face来发送一个data包
// @receiver v
// @param face
// @param dstIdStr the Interest Name
// @param payload 负载
// @return error
//
func (v *DemoServer) sendDataPacket(face *logicface.LogicFace, dstIdStr string, payload []byte) error {
data := new(packet.Data)
identifier, err := component.CreateIdentifierByString(dstIdStr)
if err != nil {
log.Println("create identifier from ", dstIdStr, " error: ", err)
return nil
}
data.SetName(identifier)
data.SetTTL(64)
data.SetValue(payload)
log.Println("send packet to reply : ", dstIdStr)
fmt.Println("demo server send: ", byteToString(payload), " len is: ", len(payload))
return face.SendData(data)
}