2011-06-26 34 views
0

问题C#插座图像转印:文件有时部分地传递

我有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 

我怎么能始终不转移的中间状态的完整文件?为什么会发生?

+0

你试图发送的文件有多大? – Ben

+0

only abt'200kb' – Sudantha

回答

3

Socket.Receive文件:

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

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

所以,如果你得到一个部分阅读,你应该再次打电话Socket.Receive。您可以使用Socket.Receive的超载继续读入相同的缓冲区。

下面是一篇文章,介绍如何“继续念”,直到你得到你想要的东西:

如果你不知道数据有多大,你必须保持直到Socket.Receive返回零。

+0

hi rick im using'int l = Socket.Receive(buffer,buffer.Length,SocketFlags.None);'* int l *将指定传输的文件大小,并将im创建为'l'的长度...这发生了几次:-s – Sudantha

+0

这个想法是停止接收,并且每1000个字节左右重新开始,直到套接字接收返回零,这允许您无限期地接收数据(您应该在此上限,所以没有人可以通过永久提供数据来为您的服务器提供服务)。 – Ben

+0

@Sudantha:即使你知道这个长度,套接字也可以为你提供数据。在我给出的链接中使用“接收”方法将这些部分重新组合为已知尺寸。 –