1

我有以下代码

        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 需要很长时间才能变为真。

原因与网络有关,可能是防火墙,代理?或客户端(太慢)或服务器?

我无法重现这种情况。

编辑:我尝试通过使用异步客户端和同步服务器来重现错误

进行以下修改:客户端=>

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 秒

正如它发生在我们的一个装置中一样

编辑:这个问题的答案消失了!!!

4

2 回答 2

0

不要忘记第一次检查时res.IsCompleted,您总是在等待下一次检查。

于 2013-09-27T10:11:55.537 回答
0

即使BeginSend不会停止您的应用程序,它仍应具有与Send. 这个答案解释了为什么事情可能会出错(我已经解释过):

对于您的应用程序,TCP 缓冲区、网络和本地发送 TCP 缓冲区是一大缓冲区。如果远程应用程序在从其 TCP 缓冲区读取新字节时出现延迟,最终您的本地 TCP 缓冲区将(几乎)满。在 TCP 缓冲区有足够的空间来存储您尝试发送的有效负载之前,发送不会完成。

于 2015-10-19T09:00:13.097 回答