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

C#套接字图像传输:文件有时部分传输,c#,php,sockets,C#,Php,Sockets,问题 我有PHP客户端,它将图像文件发送到C套接字服务器。我的问题是大约30%的时间文件被部分传输并停止 PHP-END-> $file = file_get_contents('a.bmp'); socket_write($socket,$file); C#END-> int l= Socket.Receive(buffer, buffer.Length, SocketFlags.None); //create the file using a file stream 如何在没有中间

问题

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

PHP-END->

$file = file_get_contents('a.bmp');
socket_write($socket,$file);
C#END->

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

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

来自以下文档:

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

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

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

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


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

来自以下文档:

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

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

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

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


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

您尝试发送的文件有多大?您尝试发送的文件有多大?hi rick im使用
int l=Socket.Receive(buffer,buffer.Length,SocketFlags.None)
int l将指定传输的文件大小和im创建长度为
l
。。。这种情况会发生几次:-想法是停止接收,然后每隔1000字节左右重新开始,直到套接字接收返回零,这允许您无限期地接收数据(不过您应该对此设置上限,这样就没有人可以通过永远向您提供数据来ddos攻击您的服务器)。@Sudantha:即使您知道长度,套接字可以为您提供数据片段。使用我给出的链接中的
Receive
方法将碎片重新组装成已知大小。是的,这是真的!程序如何停止?所有数据将在最大值(总数据包的MTU)处分解。您必须始终循环读取数据。这就是为什么网络协议有时会以一定的大小在数据之前,或者以“数据包结束”结构成功。这是您知道何时停止循环的方式。hi rick im使用
int l=Socket.Receive(buffer、buffer.Length、SocketFlags.None)
int l将指定传输的文件大小和im创建长度为
l
。。。这种情况会发生几次:-想法是停止接收,然后每隔1000字节左右重新开始,直到套接字接收返回零,这允许您无限期地接收数据(不过您应该对此设置上限,这样就没有人可以通过永远向您提供数据来ddos攻击您的服务器)。@Sudantha:即使您知道长度,套接字可以为您提供数据片段。使用我给出的链接中的
Receive
方法将碎片重新组装成已知大小。是的,这是真的!程序如何停止?所有数据将在最大值(总数据包的MTU)处分解。您必须始终循环读取数据。这就是为什么网络协议有时会以一定的大小在数据之前,或者以“数据包结束”结构成功。这就是你如何知道何时停止在你的循环。