2012-02-17 18 views
6

Tôi đã chỉ định ReceiveTimout là 40 ms. Nhưng phải mất hơn 500ms để nhận được thời gian chờ. Tôi đang sử dụng Đồng hồ bấm giờ để tính thời gian biểu.Socket ReceiveTimeout

Mã được hiển thị bên dưới.

Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
           ProtocolType.Tcp); 
TCPSocket.ReceiveTimeout = 40; 

try 
{ 
    TCPSocket.Receive(Buffer); 

} catch(SocketException e) { } 
+1

Vui lòng cung cấp một số mã khác. – rekire

Trả lời

0

Tôi thấy điều này một:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null); 

bool success = result.AsyncWaitHandle.WaitOne(40, true); 

if (!success) 
{   

      socket.Close(); 
      throw new ApplicationException("Failed to connect server."); 
} 
+0

Tôi yêu cầu Receive phải đồng bộ không đồng bộ. Ngoài ra tôi không muốn các ổ cắm được đóng lại nếu nhận thời gian ra. –

7

Bạn đồng bộ có thể thăm dò ý kiến ​​trên các ổ cắm với bất kỳ thời gian chờ bạn muốn. Nếu Poll() trả về true, bạn có thể chắc chắn rằng bạn có thể thực hiện cuộc gọi đến Receive() sẽ không chặn.

Socket s; 
// ... 
// Poll the socket for reception with a 10 ms timeout. 
if (s.Poll(10000, SelectMode.SelectRead)) 
{ 
    s.Receive(); // This call will not block 
} 
else 
{ 
    // Timed out 
} 

Tôi khuyên bạn nên đọc Chương trình mạng UNIX của Chương 7 và 16 để biết thêm thông tin chi tiết về cách sử dụng ổ cắm không chặn. Mặc dù cuốn sách có UNIX trong tên của nó, kiến ​​trúc ổ cắm tổng thể về cơ bản giống nhau trong UNIX và Windows (và .net)

2

Bạn không thể sử dụng giá trị thời gian chờ dưới 500 mili giây. Xem ở đây để SendTimeout: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

Mặc dù MSDN không nêu rõ yêu cầu tương tự cho các ReceiveTimeout, kinh nghiệm của tôi cho thấy rằng hạn chế này vẫn còn đó.

Bạn cũng có thể đọc thêm về vấn đề này trên nhiều SO bài viết: