往socket发送大量数据,接收方无法读取到完整数据

大家有没有遇到一种情况,客户端往服务器的socket发送了一个很大的数据(3万+byte),在服务器那边read socket的时候没有读到所有的数据,服务器用while去读但是都无法读到客户端发过来的所有数据,读取socket fd的代码如图
图片说明

3个回答

建议你从如下角度检查或修改代码:

  1. 你是否使用循环send,并确定3W+字节都已经发送?
  2. TCP传输数据会受网络影响,如果网络发生拥塞,3W+字节可能不会一次性全部到达,这样仍然可能在收完3W+字节数据前read返回EAGAIN,这种情况下,建议你在包头加4个字节的int值来标识整个数据包的长度,然后你的收包端代码先读取这个长度,然后再在多次循环中将数据收齐(如返回EAGAIN,那就等待下次再接收后续数据)
Cashey1991
开水 回复开水: 纠正一下:shutdown之后,对端继续读,read会返回0(不是-1),这样你就知道已经读完全部数据了
5 年多之前 回复
Cashey1991
开水 你可以让发送端发完数据后主动调用shutdown(iFd, SHUT_WR),这样对端再read会立即返回-1。
5 年多之前 回复
LLR104
LLR104 回复开水: 等一下,再问一下,我在包头加了个4字节,服务器按着这4字节去read数据,但是如果客户端前4字节并没有告诉server长度,这时候服务器就没法读取数据,缓冲区就一直被占用,请问这时候该怎么做容错性呢?
5 年多之前 回复
Cashey1991
开水 回复LLR104: 问题解决了就采纳下呗
5 年多之前 回复
LLR104
LLR104 有循环去send,我用了你的方法实现了,谢谢!(在包头加4个字节的int值来标识整个数据包的长度,然后你的收包端代码先读取这个长度,然后再在多次循环中将数据收齐(如返回EAGAIN,那就等待下次再接收后续数据))
5 年多之前 回复

建议你先发少量的数据试试通讯是否正常?另外,你的大数据发送时有没有分包呢?是需要分包处理的。

Shigure_Q
Shigure_Q 回复fstone_chn: 因为这份代码我也是在参考书上看到的,不理解所以来问,现在明白了
4 年多之前 回复
91program
91program 回复LLR104: 不用关心?如果在网络层放包太多,一个包的丢失就会导致所有数据接收不到。所以建议你还是在应用层进行分包处理,不要依赖于底层。因为你如果依赖于它,出现任何问题你都无从分析。
5 年多之前 回复
LLR104
LLR104 5k以下的数据可以正常通讯,TCP传输数据的分包在应用层面上是不用关心的吧,分包是TCP协议做的事,对方收到的数据也应该是TCP组合后的数据啊!
5 年多之前 回复

有循环去send,我用了你的方法实现了,谢谢!(在包头加4个字节的int值来标识整个数据包的长度,然后你的收包端代码先读取这个长度,然后再在多次循环中将数据收齐(如返回EAGAIN,那就等待下次再接收后续数据))

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问