[英]Problem with sockets in C#
Socket socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
...
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
...
socket.Send(bytesSent, bytesSent.Length, 0);
...
bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
套接字发送数据后,服务器不响应,因此程序等待响应。 如何在1000毫秒后停止接收数据? Ы
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.RecieveTimeout = 1000;
socket.SendTimeout = 1000;
// Not needed
// socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
IPAddress ipAddress = IPAddress.Parse("192.168.2.2");
int port = 9000;
try
{
// could take 15 - 30 seconds to timeout, without using threading, there
// seems to be no way to change this
socket.Connect(ipAddress, port);
// Thanks to send timeout this will now timeout after a second
socket.Send(bytesSent, bytesSent.Length, 0);
// This should now timeout after a second
bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
}
finally
{
socket.Close();
}
在调用socket.Receive(...)之前,请设置此属性。 从MSDN
socket.ReceiveTimeout = 1000;
您可以使用Socket.Poll()来代替依赖Socket.ReceiveTimeout的工作。 当发生超时时,使用ReceiveTimeout会引发异常,而Poll()不会。 现在,您将能够以更优雅的方式处理超时。
var received = -1;
var receiveBuffer = new byte[_receiveBufferSize];
// The poll will timeout after 5 seconds (Defined in microseconds)
var canRead = _socket.Poll(5000000, SelectMode.SelectRead);
if(canRead)
received = _socket.Receive(receiveBuffer);
if (received > 0)
{
// Parse the buffer
}
else
{
// Do other stuff
}
根据此MS文章 ,您需要在接收之前调用“接受”,在发送之前调用“连接”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.