package mainimport ("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}// 用大端格式读取Sizesize := binary.BigEndian.Uint16(sizeBuffer) //Lfmt.Printf("L=%d\n", size)// 分配包体大小body := make([]byte, size)// 读取包体数据_, err = io.ReadFull(conn, body) //body = T+Vif 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)) + 2fmt.Printf("send L=%d\n", L)//T := 1buffer := make([]byte, L+2)// 将包体长度写入缓冲binary.BigEndian.PutUint16(buffer, uint16(L))tmp := make([]byte, 2)binary.LittleEndian.PutUint16(tmp, T)copy(buffer[2:4], tmp)// 将包体数据写入缓冲copy(buffer[2+2:], json_content)// 将数据写入Socketif _, err := conn.Write(buffer); err != nil {return err}return nil
}//LTV格式收发包
func process(conn net.Conn) {defer conn.Close() // 关闭连接for {req, err := RecvPck(conn)if err != nil && err == io.EOF {fmt.Printf("client close %s %d\n", conn.RemoteAddr().(*net.TCPAddr).IP,conn.RemoteAddr().(*net.TCPAddr).Port)break}err = SendPck(conn, 2, req.Content)//conn.Write([]byte(recvStr)) // 发送数据}
}func main() {listen, err := net.Listen("tcp", "127.0.0.1:20000")if err != nil {fmt.Println("listen failed, err:", err)return}fmt.Println("listen on 127.0.0.1:20000")for {conn, err := listen.Accept() // 建立连接if err != nil {fmt.Println("accept failed, err:", err)continue}fmt.Printf("new client %s %d\n", conn.RemoteAddr().(*net.TCPAddr).IP,conn.RemoteAddr().(*net.TCPAddr).Port)go process(conn) // 启动一个goroutine处理连接}
}
package mainimport ("bufio""encoding/binary""encoding/json""fmt""io""net""os""strings"
)type REQ struct {Code    int64  //Content string // 发送的内容
}type RESP struct {Content string // 发送的内容Code    int64  //
}func RecvPck(conn net.Conn) (*RESP, error) {var sizeBuffer = make([]byte, 2)_, err := io.ReadFull(conn, sizeBuffer)if err != nil {fmt.Println("read head err")return nil, err}// 用大端格式读取Sizesize := binary.BigEndian.Uint16(sizeBuffer) //Lfmt.Printf("L=%d\n", size)// 分配包体大小body := make([]byte, size)// 读取包体数据_, err = io.ReadFull(conn, body) //body = T+Vif err != nil {fmt.Println("read body err")return nil, err}T := binary.LittleEndian.Uint16(body[:2])fmt.Printf("T=%d\n", T)req := &RESP{}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, msg string) error {resq := &REQ{Code:    int64(T),Content: msg,}json_content, _ := json.Marshal(resq)L := len(string(json_content)) + 2fmt.Printf("send L=%d\n", L)//T := 1buffer := make([]byte, L+2)// 将包体长度写入缓冲binary.BigEndian.PutUint16(buffer, uint16(L))tmp := make([]byte, 2)binary.LittleEndian.PutUint16(tmp, T)copy(buffer[2:4], tmp)// 将包体数据写入缓冲copy(buffer[2+2:], json_content)// 将数据写入Socketif _, err := conn.Write(buffer); err != nil {return err}return nil
}//LTV格式收发包
func process(conn net.Conn) {defer conn.Close() // 关闭连接for {req, err := RecvPck(conn)if err != nil && err == io.EOF {fmt.Printf("server close %s %d\n", conn.RemoteAddr().(*net.TCPAddr).IP,conn.RemoteAddr().(*net.TCPAddr).Port)break}fmt.Printf("%+v\n", req)}
}func main() {conn, err := net.Dial("tcp", "127.0.0.1:20000")if err != nil {fmt.Println("conn failed, err:", err)return}fmt.Println("connect ok")go process(conn) // 启动一个goroutine处理连接for {// 从键盘读取数据,直到读到换行为止text, err := bufio.NewReader(os.Stdin).ReadString('\n')if err != nil {break}// 去掉空白字符text = strings.TrimSpace(text)err = SendPck(conn, 1, text)}
}
/*
gcc -o client client.c
*/#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>int tcp_client(const char*ip, int port);int main()
{int fd = tcp_client("127.0.0.1", 20000);assert(fd);//LTVchar json_str[20] = "{\"Content\":\"qwe\"}";unsigned short type = 1;unsigned short len = sizeof(type) + strlen(json_str);char *buf = (char*)malloc(len + 2);*(unsigned short*)buf = htons(len);//L是大端*(unsigned short*)(buf+2) = type;memcpy(buf+2+2, json_str, strlen(json_str));printf("send body len=%d\n", len);write(fd, buf, len + 2);memset(buf, 0, len + 2);char tmp[3];read(fd, tmp, 2);len = *(unsigned short*)tmp;len = ntohs(len);printf("recv body len=%u\n", len);memset(buf, 0, len + 2);read(fd, buf, len);buf[len] = '\0';type = *(unsigned short*)buf;printf("L=%d,T=%d,V=%s\n", len, type, buf+2);//free(buf);close(fd);
}int tcp_client(const char*ip, int port)
{int sock;struct sockaddr_in addr;memset(&addr, 0, sizeof addr);addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(ip);addr.sin_port = htons(port);sock = socket(AF_INET, SOCK_STREAM, 0);socklen_t len = sizeof addr;int r = connect(sock, (struct sockaddr*)&addr, len);if(r==-1){return 0;}else{return sock;}
}

go语言 tcp封包LTV格式相关推荐

  1. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  2. 【网络原理2】---TCP协议的格式

    传输层重点协议 TCP 协议 TCP 协议段格式 TCP内部的工作机制 1. 确认应答 2.超时重传 TCP 协议 TCP 协议相对于 UDP 是复杂不少的. 在网络编程这里已经讲了 TCP 的特点: ...

  3. 关于TCP封包、粘包、半包

    关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...

  4. R语言dataframe数据列格式转换(从整型integer转化为浮点型float)

    R语言dataframe数据列格式转换(从整型integer转化为浮点型float) 目录 R语言dataframe数据列格式转换(从整型integer转化为浮点型float)

  5. 5.3.1 TCP协议特点和TCP报文段格式

    5.3.1 TCP协议特点和TCP报文段格式

  6. TCP/IP报文格式

    TCP/IP报文格式 修改浏览权限 | 删除 1.IP报文格式 IP协议是TCP/IP协议族中最为核心的协议.它提供不可靠.无连接的服务,也即依赖其他层的协议进行差错控制.在局域网环境,IP协议往往被 ...

  7. Go语言TCP Socket编程

    2019独角兽企业重金招聘Python工程师标准>>> Go语言TCP Socket编程 Golang的 主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不 ...

  8. c语言输出函数语句,c语言输出语句及格式输出函数介绍

    c语言输出语句及格式输出函数介绍 发布时间:2020-04-17 09:59:48 来源:亿速云 阅读:75 作者:小新 这篇文章主要为大家详细介绍了c语言输出语句及格式输出函数,文中示例代码介绍的非 ...

  9. 计算机网络(二十四)UDP及TCP首部的格式

    计算机网络(二十四)UDP及TCP首部的格式 UDP首部的格式 a.源端口号(Source Port) b.目标端口号(Destination Port) c.包长度(Length) d.校验和(Ch ...

最新文章

  1. WKWebView Safari调试、JS互调、加载进度条、JS中alert、confirm、prompt
  2. 适用于SQL Server生产环境DBA的七大技巧
  3. jupyter notebook运行出错:ModuleNotFoundError: No module named ‘keras‘ 解决办法
  4. IT人员健康信号之鼻炎养护
  5. .NET开发框架(九)-NLB网络负载平衡配置实战(视频)
  6. restful json_Dropwizard:轻松的RESTful JSON HTTP Web服务
  7. gateway动态路由_微服务与网关技术(SIA-GateWay)
  8. 如何解决: ModuleNotFoundError: No module named ‘object_detection‘
  9. 中心极限定理_中心极限定理的的原理与应用
  10. 【医疗影像处理】使用前景像素的均值和方差(mean,std)对图像进行归一化(背景像素为0)【numpy-code】
  11. 【Linux基础】在 Linux 上安装软件的 3 种方法
  12. RK3588超强8K视频输出NRV边缘计算盒 AI人工智能
  13. 中职计算机组装与维护实训教案,《计算机组装与维护》——计算机组装与维修的基础知识教学教案(中职教育)...
  14. java 生成ppt_Java 创建并应用幻灯片母版
  15. 用Excel和OutLook实现自动批量发邮件
  16. 如何把flv格式转成mp4格式?
  17. 20130327-[转]讲完这个故事我就要嫁给别人
  18. 手机设计尺寸 - iPhone界面尺寸
  19. DEVOPS技术实践_04:Jenkins参数化构建
  20. spark dataframe和dataSet用电影点评数据实战

热门文章

  1. 免费午餐已经结束——软件历史性地向并发靠拢
  2. 基于HTML美食餐饮文化项目的设计与实现 HTML学生网页设计作业 计算机毕业设计 HTML+CSS+JavaScript...
  3. linux如何运行windows游戏,Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
  4. 彰显年轻时尚的个性主张,GalaxyA6s首销获市场认可
  5. 微信打开手机内置浏览器跳转手机默认浏览器打开html网页
  6. 高清壁纸预览下载小程序源码分享
  7. 四月份班级活动 – 记杨老师的博弈论讲座
  8. 38.求解简单表达式。输入一个形式如“操作数  运算符  操作数”的四则运算表达式,输出运算结果,要求使用switch语句编写
  9. 【某航】A*算法实现十五数码问题--人工智能课程大作业
  10. PostgreSQL安装(Mac)