go语言 tcp封包LTV格式

本文深入探讨了如何在Go语言中实现TCP封包的Length-Type-Value(LTV)格式,详细解释了长度字段、类型字段和值字段的设计与处理,包括封包的发送和接收过程,以及在实际网络通信中的应用和优化技巧。
摘要由CSDN通过智能技术生成
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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值