C#套接字映像传输:文件有时会部分传输


C# socket image transfer: file sometimes partially transferred

问题

我有一个PHP客户端,它将图像文件发送到C#套接字服务器。我的问题是30%文件被部分传输并停止的时间。

PHP结束->

$file = file_get_contents('a.bmp');
socket_write($socket,$file);

C#结束->

 int l= Socket.Receive(buffer, buffer.Length, SocketFlags.None);
  //create the file using a file stream

如何在没有中间状态的情况下始终传输完整文件?为什么会发生这种情况?

来自Socket.Receive:的文档

如果使用面向连接的Socket,Receive方法将读取尽可能多的可用数据,最多不超过size参数指定的字节数。如果远程主机使用Shutdown方法关闭Socket连接,并且已接收到所有可用数据,则Receive方法将立即完成并返回零字节。

这意味着您可能会得到少于总量的。这就是套接字的工作方式。

因此,如果得到部分读取,则应该再次调用Socket.Receive。您可以使用Socket.Receive的重载继续读取同一缓冲区。

这里有一篇文章展示了如何"继续阅读",直到你得到你想要的:

  • 套接字发送和接收

如果您不知道数据有多大,则必须继续读取,直到Socket.Receive返回零。