2011-05-23 58 views
1

我有這種方法,我用它來發送傳輸對象Socket.send()懸掛/睡在服務器

 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 7777); 
     Socket sockListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
     sockListener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     sockListener.Bind(ipEnd); 
     sockListener.Listen(100); 


     s = sockListener.Accept(); 

private void sendToClient(Transfer.Transfer tt) 
    { 
     byte[] buffer = new byte[15000]; 

     IFormatter f = new BinaryFormatter(); 
     Stream stream = new MemoryStream(buffer); 
     f.Serialize(stream, tt); 
     Console.WriteLine("1/3 serialized"); 
     stream.Flush(); 
     Console.WriteLine("2/3 flushed stream"); 
     s.Send(buffer, buffer.Length, 0); 
     Console.WriteLine("3/3 send to client"); 
    } 

奇怪的是它工作的第2次我打電話,然後3號稱它掛在s.send()上。

它是相同的,如果我想發送字符串,而不是傳輸。

+1

也許你的客戶沒有閱讀你發送的東西,在這種情況下,服務器最終會因各種緩衝區填滿而阻塞。 – nos 2011-05-23 18:47:03

回答

0

@nos發表的評論可能是正確的,TCP發送緩衝區可能已經填滿,第三次調用s.send()會阻塞,直到數據通過網絡發送。您可以設置使用的緩衝大小是這樣的:

Socket s = sockListener.Accept(); 
s.ReceiveBufferSize = 1024 * 64; 
s.SendBufferSize = 1024 * 64; 

您應該能夠通過你的緩衝區的大小設置爲數據的你發送的尺寸較大倍數,以確認您的問題。

此外,建議您應該檢查客戶端以確保其正確讀取數據。