/*封包,适用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;
}
适用封包和拆包解决tcp粘包问题(linux)
最新推荐文章于 2024-08-15 14:47:41 发布