mirror of
https://gitee.com/willfree/min-usage.git
synced 2026-06-03 08:16:57 +08:00
94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"minlib/packet"
|
|
"unsafe"
|
|
)
|
|
|
|
//
|
|
// @Description: 专门负责从客户端接收MIN包的协程
|
|
// @receiver v
|
|
//
|
|
func (v *DemoServer) recvPacketFromClientRoutine() {
|
|
for v.state {
|
|
err := v.recvPacketFromClient()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// @Description: 专门负责从客户端接收MIN包的协程
|
|
// @receiver v
|
|
// @return error
|
|
//
|
|
func (v *DemoServer) recvPacketFromClient() error {
|
|
interest, err := v.mFace.ReceiveInterest(-1)
|
|
log.Println("recv interest packet from client: ", byteToString(interest.GetValue()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
v.receivePacketQue <- interest
|
|
return nil
|
|
}
|
|
|
|
//
|
|
// @Description: 启动处理从客户端发来的IP包的协程
|
|
// @receiver v
|
|
//
|
|
func (v *DemoServer) dealWithRecvPktRoutine() {
|
|
for v.state {
|
|
err := v.dealWithRecvPkt()
|
|
if err != nil {
|
|
log.Println(err)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// @Description: 处理客户端发来的IP包
|
|
// @receiver v
|
|
// @return error
|
|
//
|
|
func (v *DemoServer) dealWithRecvPkt() error {
|
|
interest, ok := <-v.receivePacketQue
|
|
if !ok {
|
|
return errors.New("get interest packet from receivePacketQue error")
|
|
}
|
|
payload := interest.GetValue()
|
|
payloadLen := len(payload)
|
|
fmt.Println("demo server received: ", byteToString(payload), " len is: ", payloadLen)
|
|
v.ReturnHelloToClient(interest, payload)
|
|
return nil
|
|
}
|
|
|
|
func (v *DemoServer) ReturnHelloToClient(pkt *packet.Interest, payload []byte) {
|
|
interestPrefix := pkt.GetName().ToUri()
|
|
headString := stringToBytes(ResStringHead)
|
|
sendBytes := make([]byte, len(headString)+len(payload))
|
|
for i := 0; i < len(headString); i++ {
|
|
sendBytes[i] = headString[i]
|
|
}
|
|
for i := len(headString); i < len(headString)+len(payload); i++ {
|
|
sendBytes[i] = payload[i-len(headString)]
|
|
}
|
|
err := v.sendDataPacket(&v.mFace, interestPrefix, sendBytes)
|
|
if err != nil {
|
|
fmt.Println("send hello for client error!")
|
|
return
|
|
}
|
|
}
|
|
|
|
func stringToBytes(str string) []byte {
|
|
return *(*[]byte)(unsafe.Pointer(&str))
|
|
}
|
|
|
|
func byteToString(bytes []byte) string {
|
|
return *(*string)(unsafe.Pointer(&bytes))
|
|
}
|