Files
min-usage/ServerClientDemo/DemoServer/Server.go
T

99 lines
2.7 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.GPPkt // 从客户端收包后,放入该队列
state bool // 程序生成状态, true 为正常运行, false 为关闭状态
srcIdentifier *component.Identifier // 源地址
//keyChain *security.KeyChain
}
func (s *DemoServer) Init() {
s.receivePacketQue = make(chan *packet.GPPkt, 10000)
//s.initKeyChain()
s.state = true
}
func (v *DemoServer) initKeyChain() {
//var err error
//v.keyChain, err = security.CreateKeyChain()
//if err != nil {
// log.Fatal("create key chain error: ", err)
//}
//if err = v.keyChain.InitialKeyChainByPath("/usr/local/.mir/identity/"); err != nil {
// log.Fatal("create key chain error: ", err)
//}
//identity := v.keyChain.GetIdentityByName(IdentityName)
//if identity == nil {
// log.Fatal("identity : ", IdentityName, " is not exist")
//}
//if err = v.keyChain.SetCurrentIdentity(identity, IdentityPasswd); err != nil {
// log.Fatal(err)
//}
}
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)
}
//s.mFace.SetKeyChain(s.keyChain)
err = s.mFace.RegisterPushIdentifier(s.srcIdentifier, 2000)
if err != nil {
log.Fatal(err)
}
log.Println("listen on prefix : ", VpnServerPrefix)
// 启动处理接收到的包的协程
for i := 0; i < 4; i++ {
go s.dealWithRecvPktRoutine()
}
// 启动从客户端接收包的协程
s.recvPacketFromClientRoutine()
return nil
}
//
// @Description: 使用一个face来发送一个cpacket包
// @receiver v
// @param face
// @param dstIdStr 目的地址
// @param payload 负载
// @return error
//
func (v *DemoServer) sendCPacket(face *logicface.LogicFace, dstIdStr string, payload []byte) error {
cPacket := new(packet.GPPkt)
identifier, err := component.CreateIdentifierByString(dstIdStr)
if err != nil {
log.Println("create identifier from ", dstIdStr, " error: ", err)
return nil
}
cPacket.SetDstIdentifier(identifier)
cPacket.SetSrcIdentifier(v.srcIdentifier)
cPacket.SetTTL(64)
cPacket.SetValue(payload)
log.Println("send packet to : ", dstIdStr)
//err = v.keyChain.SignGPPkt(cPacket)
//if err != nil {
// log.Println("sign packet error ", dstIdStr, " error: ", err)
// return nil
//}
fmt.Println("demo server send: ", byteToString(payload), " len is: ", len(payload))
return face.SendGPPkt(cPacket)
}