流式套接字编程中收包问题

在TCP流式套接字编程中,接收数据时可能会遇到粘包、分片等问题,导致无法读取完整的应用数据包。本文关注如何确保从接收缓冲中分离出单独的完整数据包,通过线程循环和特定的分包算法实现。代码示例中,`get_complete_packet`函数利用线程本地存储保证多线程安全,而获取数据包长度的`packet_lengthof`函数需根据具体应用协议定义。
摘要由CSDN通过智能技术生成

TCP传输是提供给用户一种可靠的面向连接的数据服务,开销当然也大。在编程实践中对应于流式套接字网络程序设计了。

对于发送数据且不作论,咱们很容易遇到一个问题就是套接字在读取接收缓冲的时候,我们以什么办法来保证读取一次完整的应用数据包?

面向连接的套接字操作中,尤其说在接收消息过程中,我们是输入一数据存储来调用套接字接收消息,当有可读的内容时,会返回写入输入数据区实际字节数。这很容易造成的问题就是,读到的数据很有可能不是一个完整的包,或可以是多个数据包粘连一起了等等现象。从网上随便一搜TCP粘包现象,就一堆话题出来。当然粘包现象只是我们要考虑的一种,对与对策就是分包算法。但这里,不独细究粘包现象与分包算法。

因为除了粘包问题,同时我们接收也可能出现数据包被分片而截断等种种问题。最终我们想要的是怎么保证收取消息过程中从读出的数据内容中将独个完整的数据包分离出来,并交付于逻辑层处理。

 

Okay,多余的不多说。下面针对单个套接字的收取线程循环来设计相应对策。代码见下

线程循环,套接字消息收取部分代码

// the socke recv thread code

msglen = recv(s, buffer, buffsz, 0);
if (msglen>0)
{
	int offset = 0;
	char *compacket = NULL;// point to a complete data packet
	while (compacket = get_complete_packet(buffer + offset, msglen - offset))
	{
		// packet_lengthof(char*)  to get the length of the data packet
	
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值