Files
min-usage/ServerClientPullDemo/DemoPullServer/HandleDataFromClient.go
T
2022-07-28 21:06:08 +08:00

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))
}