TCP粘包/拆包问题处理手段
TCP粘包/拆包问题处理手段
钟路强 发表于1年前
TCP粘包/拆包问题处理手段
  • 发表于 1年前
  • 阅读 73
  • 收藏 1
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

TCP以流的方式处理数据,数据发送和接收过程中可能出现拆包或粘包现象,即一次发送的数据分两次接收,或两次发送的数据被一次接收。这在以某种约定协议进行通信的程序设计过程中需要慎重考虑,如果发生粘包或拆包,将使得一次接收的数据报文不完整,所以一般需要将报文设计成定长,或是加入长度字段,按指定的长度来接收数据。按下面这个函数来设计接收程序,可以保证一次读取到所有希望读取的字节数。

/*读取固定字节的数据,数据不够或读取出错时返回-1,成功则返回读取的字节数*/
int read_n(int fd, void *buffer, int count)
{
	int ret;
	int nread, nleft;
	unsigned char *ptr;
	fd_set rset;
	
	ptr = buffer;
	nleft = count;
	while(nleft > 0)
	{
		FD_ZERO(&rset);
		FD_SET(fd, &rset);
		ret = select(fd + 1, &rset, NULL, NULL, NULL);
		if(ret < 0)
		{
			printf("select error\n");
			return -1;
		}
		else
		{
			nread = recv(fd, ptr, nleft, 0);
			if(nread < 0)
			{
				if(errno == EINTR)
				{
					nread = 0;
					printf("EINTR happen when select\n");
				}
				else
				{
					printf("recv error\n");
					return -1;
				}
			}
			else if(nread == 0)
			{
				if((count - nleft) != 0)
				{
					printf("connection closed\n");
					break;
				}
				else
				{
					printf("connection closed errno = %d\n", errno);
					return -1;
				}
			}
			nleft -= nread;
			ptr += nread;
		}
	}
	return count - nleft;
}
共有 人打赏支持
粉丝 1
博文 3
码字总数 6797
×
钟路强
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: