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

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 {
cPacket, err := v.mFace.ReceiveGPPkt(-1)
log.Println("recv packet from client: ", byteToString(cPacket.GetValue()))
if err != nil {
return err
}
v.receivePacketQue <- cPacket
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 {
cPacket, ok := <-v.receivePacketQue
if !ok {
return errors.New("get packet from receivePacketQue error")
}
payload := cPacket.GetValue()
payloadLen := len(payload)
fmt.Println("demo server received: ", byteToString(payload), " len is: ", payloadLen)
v.ReturnHelloToClient(cPacket, payload)
return nil
}
func (v *DemoServer) ReturnHelloToClient(pkt *packet.GPPkt, payload []byte) {
clientPrefix := pkt.SrcIdentifier().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.sendCPacket(&v.mFace, clientPrefix, 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))
}