socket 文件传输不完整

时间:2022-11-10 20:06:34
伪代码如下
Server
while(true)
{
   recv(buf,..);
   if(buf=="end")
     {
        break;
      }
    else
     {  
       fwrite();
     }
}
Client
while(!feof(fp)
{   
     fread(buf,...);
     send(socket,..);
}
小文件可以完整接受,但大的文件就会小1-2k
怀疑是粘包或者是接收端部分数据没有接收到
麻烦各位给指点下

14 个解决方案

#1


recv(), send()请检查返回值。

#2


1、你的buffer的大小是多少?
2、大的文件是多大?
3、什么要的网络条件,如果是局域网的话,丢包的可能性不大 ,你使用抓包软件抓包看看
4、最好写个日志来进行分析。

#3


如果能够排除文件读取不完整的情况,你的发送端是否存在发送失败的情况?

#4


搭一下便车,
请问一下如何开发基于蓝牙的Winodws PC 程序与手机等设备传输数据:
   1、开发环境要求,Winsock是否可以满足了,与传统的网络编程有何区别,
   2、蓝牙各种协议栈是否会带来兼容性问题。。
   3、通过虚礼串口实现和通过Winsock实现比较。。。

谢谢!!!

#5


猜想: 会不会是客户端接收数据太慢,,接收数据的缓冲区益处。。。。

#6


文件读的没问题,buf为1k,5楼的接受数据缓冲区溢出怎么理解?

#7


问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

#8


引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?


明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。

#9


发送100k要休眠,但是这应该不是问题的原因吧。
首先确认重发机制,然后,据说 不要使用feof,使用文件length判断是否发送完成。

#10


引用 8 楼 wizardk 的回复:
引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

 明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。


正解 send函数,一定要判断,是否成功。当系统的缓存区被你塞满的时候,就会失败,你需要重新发,直到成功。send函数,并不是把数据直接发到对方,而是先发到系统缓存区,由操作系统负责真正发送,其它送速度跟网速,硬件环境有关。

#11


应该出现了滑动窗口慢的情况,发送的返回值也要判断下
另:你的判断结束的方式不是很好,最好还是先把长度发送过去,或者干脆弄个协议,没个包都要加个长度,这样才能保证接收完整

#12


tcp是字节流,因此要自行定义好应用层的协议,来标识数据流的开始和结束。

#13


buf=="end" 这样判断好像非正常做法,也没试过,一般用strcmp等

#14


引用 10 楼 cchvsgame 的回复:
引用 8 楼 wizardk 的回复:
引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

 明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。

 正解 send函数,一定要判断,是否成功。当系统的缓存区被你塞满的时候,就会失败,你需要重新发,直到成功。send函数,并不是把数据直接发到对方,而是先发到系统缓存区,由操作系统负责真正发送,其它送速度跟网速,硬件环境有关。

学习了

#1


recv(), send()请检查返回值。

#2


1、你的buffer的大小是多少?
2、大的文件是多大?
3、什么要的网络条件,如果是局域网的话,丢包的可能性不大 ,你使用抓包软件抓包看看
4、最好写个日志来进行分析。

#3


如果能够排除文件读取不完整的情况,你的发送端是否存在发送失败的情况?

#4


搭一下便车,
请问一下如何开发基于蓝牙的Winodws PC 程序与手机等设备传输数据:
   1、开发环境要求,Winsock是否可以满足了,与传统的网络编程有何区别,
   2、蓝牙各种协议栈是否会带来兼容性问题。。
   3、通过虚礼串口实现和通过Winsock实现比较。。。

谢谢!!!

#5


猜想: 会不会是客户端接收数据太慢,,接收数据的缓冲区益处。。。。

#6


文件读的没问题,buf为1k,5楼的接受数据缓冲区溢出怎么理解?

#7


问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

#8


引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?


明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。

#9


发送100k要休眠,但是这应该不是问题的原因吧。
首先确认重发机制,然后,据说 不要使用feof,使用文件length判断是否发送完成。

#10


引用 8 楼 wizardk 的回复:
引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

 明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。


正解 send函数,一定要判断,是否成功。当系统的缓存区被你塞满的时候,就会失败,你需要重新发,直到成功。send函数,并不是把数据直接发到对方,而是先发到系统缓存区,由操作系统负责真正发送,其它送速度跟网速,硬件环境有关。

#11


应该出现了滑动窗口慢的情况,发送的返回值也要判断下
另:你的判断结束的方式不是很好,最好还是先把长度发送过去,或者干脆弄个协议,没个包都要加个长度,这样才能保证接收完整

#12


tcp是字节流,因此要自行定义好应用层的协议,来标识数据流的开始和结束。

#13


buf=="end" 这样判断好像非正常做法,也没试过,一般用strcmp等

#14


引用 10 楼 cchvsgame 的回复:
引用 8 楼 wizardk 的回复:
引用 7 楼 nipk2009 的回复:
问题解决,发送100k后让发送端休眠一段时间继续发送,这样受到的数据就是完整的了。想知道每次发多少合适?

 明白了,首先你的SEND没有重发和错误处理机制,其次,你对发送缓冲没有设置大小,致使发送过大时,累积几次可能造成发送的BUFFER BLOCK错误。

 正解 send函数,一定要判断,是否成功。当系统的缓存区被你塞满的时候,就会失败,你需要重新发,直到成功。send函数,并不是把数据直接发到对方,而是先发到系统缓存区,由操作系统负责真正发送,其它送速度跟网速,硬件环境有关。

学习了