ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[问题记录]——TCP粘包问题:客户端利用length接收数据

2021-12-19 13:31:06  阅读:141  来源: 互联网

标签:文件 cnt 接收 buffer TCP 粘包 fd 接收数据 size


  • 产生的原因:TCP通信中数据包是连续、首尾相连的、没有边界的流形式,连续发送多个不同的文件时,接收端无法识别分开发送过来的多个数据。

  • 解决方案:

    1. 时间边界:延时发送。
    2. 空间边界:填空数据。
    3. 额外标志:如结束字符(a. 接收要额外解析识别; b. 内容不能再出现这个标记字符)。
    4. 自定义协议头:协议头传递重要的信息,如文件名、文件大小。

在使用第四种方法时,客户端根据协议头中的文件大小接收文件,一开始我使用这样的while循环接收文件。

size = head.length; //文件大小
while (size > 0)
{
	cnt = read(client_fd, r_buffer, RECVSIZE); //接收文件内容
    write(file_fd, r_buffer, cnt);
    size -= cnt;
}

出现了第二个文件无法正常接收的问题,经过一番排查,发现原因如下:

  • 根据文件大小接收文件时,如果判断条件是while(size>0),由于每次接收的大小n是固定RECVSIZE的,且后面跟着下一个文件的数据,这样会导致最后一次把下一个文件的数据(协议头)也接收了,经过size-=cnt后size小于0。这样虽然能使循环终止,但由于拿到了下一个文件的内容,导致接收的第一个和第二个文件都发生错误。

修改循环条件:

// int cnt1 = 0;
size = head.length;
while (size > sizeof(r_buffer))
{
    cnt = read(client_fd, r_buffer, RECVSIZE); //接收文件内容
    write(file_fd, r_buffer, cnt);
    size -= cnt;
    // cnt1 += cnt;
}
cnt = read(client_fd, r_buffer, size); //size此时不为0
// cnt1 += cnt;
// printf("DEBUG recvlen: %d\n", cnt1);

接收正常,问题解决!
在这里插入图片描述

标签:文件,cnt,接收,buffer,TCP,粘包,fd,接收数据,size
来源: https://blog.csdn.net/weixin_45941376/article/details/122022745

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有