Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么socket BeginSend会花费太长时间_C#_Sockets - Fatal编程技术网

C# 为什么socket BeginSend会花费太长时间

C# 为什么socket BeginSend会花费太长时间,c#,sockets,C#,Sockets,我有以下代码 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 &&

我有以下代码

        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++;
        }
在第二次发送中,我收到一个套接字异常。由于服务器没有读取数据,这是正常的。 但实际上我想复制的是:

正在等待传输数据。超时1秒 正在等待传输数据。超时1秒 正在等待传输数据。超时1秒 正在等待传输数据。超时1秒 正在等待传输数据。超时1秒

就像在我们的一个装置中发生的那样

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

别忘了当第一次检查完成时,您总是在等待第二次检查

即使BeginSend不会暂停您的应用程序,它仍应具有与Send相同的约束。答案解释了为什么事情会出错,我已经解释过:

对于您的应用程序,TCP缓冲区、网络和本地 发送TCP缓冲区是一个很大的缓冲区。如果远程应用程序 延迟从其TCP缓冲区读取新字节,最终 本地TCP缓冲区将接近满。发送不会成功 完成,直到TCP缓冲区有足够的空间存储有效负载 你在试着发送


定义需要很长时间,1秒钟?5秒?这取决于客户和时间。有时我看到3有时10秒通常,BeginSend的IsCompleted并不意味着实际发送了字节,而是在sendbuffer中排队。没错!,那么,为什么要花这么长时间才能将字节放入队列中呢?您可以在循环getavailablethreads时尝试这一点:是的,实际上正常的日志文件将打印出来,等待数据传输。至少有一次超时1秒,你是对的。我在2014年找到了解决方案。实际上,问题是接收机器被阻塞,没有读取数据。所以我们不得不重新设计协议。抱歉,我没有在Stackoverflow中记录解决方案。
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();
}