c#NetworkStream.Read错误无法从传输连接读取数据

时间:2019-04-03 08:00:38

标签: c# sockets networkstream

我正在构建由c#制成的套接字服务器。 客户端每秒发送一次ping数据包。 然后,服务器会定期将ping数据包传递到客户端。 当大约有20台设备连接到服务器时,短时间后会发生以下错误。

  

System.IO.IOException:无法从传输连接中读取数据:A

     

连接尝试失败,因为连接方未正确响应

     

一段时间后,或由于连接的主机

而建立的连接失败      

没有响应。 ---> System.Net.Sockets.SocketException:连接

     

尝试失败,因为关联方在

之后未正确响应      

时间段,或由于连接的主机具有

而建立的连接失败      

回复失败

     

在System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32大小)

     

---内部异常堆栈跟踪的结尾---

     

在System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32大小)

     

在System.IO.StreamReader.ReadBuffer()

     

在System.IO.StreamReader.ReadLine()

发生该错误时,几乎所有连接的客户端套接字都同时发生该错误。 服务器套接字的ReceivedTimeout和SendTimeout从3秒更改为10秒,但是以相同的方式出现错误。

我一直在寻找解决这个问题超过三天的方法

它正在通过asp.net开发并通过iis分发。

void ReceiveRunnable()        
{

            log.Debug($"Start 'Receive Runnable'");
            try
            {

                int exceptionCount = 0;

                string line;

                while (IsRun)
                {
                    try
                    {
                        while (socket != null && (line = reader.ReadLine()) != null)
                        {
                            exceptionCount = 0;

                            if (!string.IsNullOrWhiteSpace(line))
                            {
                                // Ping Packet
                                if (line[0] == '0')
                                {
                                    ReceivePingPacket(line);
                                }
                                else
                                {
                                    buffer.Enqueue(line);
                                }
                            }
                        }
                    }
                    catch (SocketException e)
                    {
                        log.Error(e + "   e:" + e.SocketErrorCode);
                        break;
                    }
                    catch (IOException e)
                    {
                        if (IsRun)
                        {
                            log.Error(e);
                            break;
                            Thread.Sleep(100);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                if (IsRun)
                {
                    log.Error(e);
                }
            }
            finally
            {
                Close();
                OnDisconnect?.Invoke(this);
            }
            log.Debug($"Stop 'Receive Runnable'");
        }

0 个答案:

没有答案