适用封包和拆包解决tcp粘包问题(linux)

/*封包,适用int类型来增加头部,四个字节*/
void sendMsg(int fd, const char* data, int length)
{
	//申请内存来存储新数据
	char* buf = (char*)malloc(length + sizeof(int));
	//将新数据报长度转换为网络字节序
	int netlen = hton1(length);
	//拷贝数据
	memcpy(buf, &netlen, sizeof(int));//dest,src,length 
	memcpy(buf + sizeof(int), data, length);
	//发送数据
	writen(fd, buf, length + sizeof(int));
}

int recvMsg(int fd, char** buf)
{
	//读包头
	int netlen = 0;
	//将读出的大端长度写入到netlen中
	int ret = readn(fd, (char*)&netlen, sizeof(int));
	//将大端转换为小端
	int len = ntoh1(netlen);
	printf("数据报长度:%d\n", len);
	//读数据
	char* tmp = (char*)malloc(len + 1);
	ret = readn(fd, tmp, len);
	tmp[len] = '\0';

	*buf = tmp;
	return ret;
}

//有没有可能多读取内容?
int readn(int fd, char* buf, int count)
{
	int nleft = count;//一共要读取的长度
	int nread = 0;		//存放每次读到了多少长度的内容
	char *pbuf = buf;
	while (nleft > 0)
	{
		nread = read(fd, pbuf, nleft);//阻塞函数,nleft标识一次最多读取nleft个字节
		if (nread == -1)//read失败
		{
			perror("read");
			return -1;
		}
		else if (nread == 0)//对端已经关闭了连接,返回已经读取的字节数
		{
			return count - nleft;
		}
		pbuf += nread;
		nleft -= nread;
	}
	return count;
}

int writen(int fd, const char* buf, int count)
{
	int nleft = count;
	int nwrite = 0;	
	char *pbuf = buf;
	while (nleft > 0)
	{
		nwrite = write(fd, pbuf, nleft);
		if (nwrite == -1)
		{
			perror("write");
			return -1;
		}
		else if (nwrite == 0)
		{
			continue;
		}
		pbuf += nwrite;
		nleft -= nwrite;
	}
	return count;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值