C++网络编程学习:网络数据报文的收发
- 使用的语言为C/C++
- 源码支持的平台为:Windows
一、网络数据报文的格式定义
- 报文有两个部分,包头和包体,是网络消息的基本单元。
- 包头: 描述本次消息包的大小,描述包体数据的作用。
- 包体: 其中包含了需要传输的数据。
根据此数据结构,我们可以根据包头的内容,来灵活的对包体的数据进行处理。
二、将包头与包体数据分开收发
1.概括
通过上文对网络数据报文的定义,我们可以很轻易的想到:
- 发送端进行两次send操作,第一次send发送包头,第二次send发送包体,即可实现网络数据报文的发送。
- 接收端进行两次recv操作,第一次recv接收包头,第二次recv接收包体并根据包头的内容进行数据处理,即可实现网络数据报文的接收。
按以上操作,即可实现网络数据报文的收发。
2.代码及其详细注释
2.1 服务端代码
1 |
|
2.2 客户端代码
1 |
|
三、将分开收发报文数据改为一次收发
1.思路
由上文,我们可以知道,可以通过两次send和两次recv进行报文的收发,但是其中操作较为麻烦,需要多次声明DateHeader包头结构体,不仅消耗时间资源,也容易出错。
因此,我们可以尝试将分开收发改为一次收发。大致思路为完善报文的结构体,使包体继承包头结构体,或者使包体结构体中包含一个包头结构体。由此完善报文的结构体,只进行一次send操作,即可发送所有报文数据。
在进行数据接收时,我们先接收包头大小的数据,随后根据包头的内容,来确定接下来接收数据的大小,即接收 总数据大小 减去 包头数据大小 的数据。而在接下来使用recv接收剩下数据时,要使用指针偏移,跳过结构体包头的接收(因为接收过了),直接接收到包体数据位置上。
1 | /* |
2.代码及其详细注释
2.1 服务端代码
1 |
|
2.2 客户端代码
1 |
|
网络编程学习记录
- 使用的语言为C/C++
- 源码支持的平台为:Windows
笔记一:建立基础TCP服务端/客户端 点我跳转
笔记二:网络数据报文的收发 点我跳转
笔记三:升级为select网络模型 点我跳转
笔记四:跨平台支持Windows、Linux系统 点我跳转
笔记五:源码的封装 点我跳转
笔记六:缓冲区溢出与粘包分包 点我跳转
笔记七:服务端多线程分离业务处理高负载 点我跳转
笔记八:对socket select网络模型的优化 点我跳转
笔记九:消息接收与发送分离 点我跳转
笔记十:项目化 (加入内存池静态库 / 报文动态库) 更多笔记请点我
@TOC
一、网络数据报文的格式定义
- 报文有两个部分,包头和包体,是网络消息的基本单元。
- 包头: 描述本次消息包的大小,描述包体数据的作用。
- 包体: 其中包含了需要传输的数据。
根据此数据结构,我们可以根据包头的内容,来灵活的对包体的数据进行处理。
二、将包头与包体数据分开收发
1.概括
通过上文对网络数据报文的定义,我们可以很轻易的想到:
- 发送端进行两次send操作,第一次send发送包头,第二次send发送包体,即可实现网络数据报文的发送。
- 接收端进行两次recv操作,第一次recv接收包头,第二次recv接收包体并根据包头的内容进行数据处理,即可实现网络数据报文的接收。
按以上操作,即可实现网络数据报文的收发。
2.代码及其详细注释
2.1 服务端代码
1 |
|
2.2 客户端代码
1 |
|
三、将分开收发报文数据改为一次收发
1.思路
由上文,我们可以知道,可以通过两次send和两次recv进行报文的收发,但是其中操作较为麻烦,需要多次声明DateHeader包头结构体,不仅消耗时间资源,也容易出错。
因此,我们可以尝试将分开收发改为一次收发。大致思路为完善报文的结构体,使包体继承包头结构体,或者使包体结构体中包含一个包头结构体。由此完善报文的结构体,只进行一次send操作,即可发送所有报文数据。
在进行数据接收时,我们先接收包头大小的数据,随后根据包头的内容,来确定接下来接收数据的大小,即接收 总数据大小 减去 包头数据大小 的数据。而在接下来使用recv接收剩下数据时,要使用指针偏移,跳过结构体包头的接收(因为接收过了),直接接收到包体数据位置上。
1 | /* |
2.代码及其详细注释
2.1 服务端代码
1 |
|
2.2 客户端代码
1 |
|