2011-06-26 39 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:即使你知道這個長度,套接字也可以爲你提供數據。在我給出的鏈接中使用「接收」方法將這些部分重新組合爲已知尺寸。 –