从NetworkStream
接收数据时,我可以配置stream.ReadTimeout
如果在配置的时间内未收到任何数据,我会获得SocketException
ex.SocketErrorCode=SocketError.TimedOut
。
我可以在此异常后继续使用流,还是有可能以某种方式丢失某些字节?
示例代码:
using (TcpClient client = new TcpClient("127.0.0.1", 2000))
using (NetworkStream stream = client.GetStream())
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
{
stream.ReadTimeout = 5000;
while (true)
{
int i;
try
{
i = reader.Read();
}
catch (IOException ex)
{
SocketError socketError = SocketError.Success;
if (ex.InnerException is SocketException)
socketError = ((SocketException)ex.InnerException).SocketErrorCode;
if (socketError == SocketError.TimedOut)
{
Console.WriteLine("no data received for 5 seconds");
continue;
}
else throw;
}
}
}
答案 0 :(得分:2)
我没有在.NET端找到任何这方面的文档,但是NetworkStream.ReadTimeout
使用(在Windows上)setsockopt本机函数,并且在这个函数的描述中,它的各种选项都清楚地说明了(在SO_RCVTIMEO
和SO_SNDTIMEO
错误代码的说明中):
如果发送或接收操作在套接字上超时,则为套接字状态 是不确定的,不应该使用;处于此状态的TCP套接字 由于可以取消操作,因此可能会丢失数据 在同一时刻,该行动将完成。