mirror of
https://gitee.com/willfree/min-usage.git
synced 2026-06-15 14:05:09 +08:00
99 lines
2.7 KiB
Go
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)
|
|
}
|