package main
import (
"encoding/binary"
"encoding/json"
"fmt"
"io"
"net"
)
type REQ struct {
Code int64 //
Content string // 发送的内容
}
type RESP struct {
Content string // 发送的内容
Code int64 //
}
func RecvPck(conn net.Conn) (*REQ, error) {
var sizeBuffer = make([]byte, 2)
_, err := io.ReadFull(conn, sizeBuffer)
if err != nil {
fmt.Println("read head err")
return nil, err
}
// 用大端格式读取Size
size := binary.BigEndian.Uint16(sizeBuffer) //L
fmt.Printf("L=%d\n", size)
// 分配包体大小
body := make([]byte, size)
// 读取包体数据
_, err = io.ReadFull(conn, body) //body = T+V
if err != nil {
fmt.Println("read body err")
return nil, err
}
T := binary.LittleEndian.Uint16(body[:2])
fmt.Printf("T=%d\n", T)
req := &REQ{
}
err = json.Unmarshal(body[2:], req)
if err != nil {
return nil, err
}
fmt.Printf("V=%+v\n", req)
return req, nil
}
func SendPck(conn net.Conn, T uint16, req string) error {
resp := &RESP{
Code: int64(T),
Content: req,
}
json_content, _ := json.Marshal(resp)
L := len(string(json_content)) + 2
fmt.Printf("send L=%d\n", L)
//T := 1
buffer := make([]byte, L+2)
// 将包体长度写入缓冲
binary.BigEndian.PutUint16(buffer, uint16(L))
tmp := make(
go语言 tcp封包LTV格式
最新推荐文章于 2023-10-10 09:53:00 发布
本文深入探讨了如何在Go语言中实现TCP封包的Length-Type-Value(LTV)格式,详细解释了长度字段、类型字段和值字段的设计与处理,包括封包的发送和接收过程,以及在实际网络通信中的应用和优化技巧。
摘要由CSDN通过智能技术生成