我有以下代码
byte[] bytes = Encoding.Default.GetBytes(data);
IAsyncResult res = socket.BeginSend(bytes, 0, bytes.Length, 0, new AsyncCallback(SendCallback), socket);
int waitingCounter = 0;
while (!res.IsCompleted && waitingCounter<10)
{
if (Tracing.TraceInfo) Tracing.WriteLine("Waiting for data to be transmited. Give a timeout of 1 second", _traceName);
Thread.Sleep(1 * 1000);
waitingCounter++;
}
这段代码已经安装在许多机器上,但是在某些情况下,条件res.IsCompleted花费很长时间才能成立。
原因与网络有关,也许是防火墙,代理?或到客户端(太慢)或到服务器?
我无法重现这种情况。
编辑:我尝试通过使用异步客户端和同步服务器来重现错误
进行以下修改:Client =>
while (true) {
Send(client, "This is a test<EOF>");
sendDone.WaitOne();
}
服务器=>
while (true){
Console.WriteLine("Waiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
// Show the data on the console.
Console.WriteLine("Text received : {0}", data);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
在第二个Send()中,我得到一个套接字异常。这是正常现象,因为服务器未读取数据。但是实际上我想重现的是:
等待数据传输。给出1秒的超时等待数据传输。给出1秒的超时等待数据传输。给出1秒的超时等待数据传输。给出1秒的超时等待数据传输。给出1秒的超时
由于它发生在我们的其中一个安装中
编辑:这个问题的答案不见了!!!
即使BeginSend
不会拖延您的应用程序,它也应具有与相同的约束Send
。这个答案解释了为什么事情会出错(我已经解释过):
对于您的应用程序,TCP缓冲区,网络和本地发送TCP缓冲区是一个很大的缓冲区。如果远程应用程序从其TCP缓冲区读取新字节时被延迟,最终您的本地TCP缓冲区将最终(几乎)已满。在TCP缓冲区有足够的空间来存储您要发送的有效负载之前,发送不会完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句