C# System.Net.Sockets.SocketException(0x80004005):主机中的软件中止了已建立的连接

C# System.Net.Sockets.SocketException(0x80004005):主机中的软件中止了已建立的连接,c#,sockets,C#,Sockets,我制作了一个windows服务远程服务器程序,它能够与windows CE deviceas远程客户端进行通信,监听广播请求,将请求保存到文件中,检查并发回正在跟踪的请求文件内容。我已经在c异步传输模式下实现了它。它工作正常,但就在2天前,我遇到了此套接字异常: System.Net.Sockets.SocketException 0x80004005:主机中的软件在System.Net.Sockets.Socket.BeginReceiveByte[]缓冲区、Int32偏移量、Int32大小、

我制作了一个windows服务远程服务器程序,它能够与windows CE deviceas远程客户端进行通信,监听广播请求,将请求保存到文件中,检查并发回正在跟踪的请求文件内容。我已经在c异步传输模式下实现了它。它工作正常,但就在2天前,我遇到了此套接字异常:

System.Net.Sockets.SocketException 0x80004005:主机中的软件在System.Net.Sockets.Socket.BeginReceiveByte[]缓冲区、Int32偏移量、Int32大小、SocketFlags SocketFlags、AsyncCallback回调、对象状态中止了已建立的连接

这是我的代码,它指向异常

     public void AcceptCallback(IAsyncResult result)
     { 

          ConnectionInfo connection = new ConnectionInfo();
          try
          {
              long connection_number;

              //finish accept
              Socket s;
              s = (Socket)result.AsyncState;
              connection.socket = s.EndAccept(result);

              connection.socket.Blocking = false;

              connection.Buffer = new byte[10000]; //1kb buffer minimum


     orionIP = ((IPEndPoint)connection.socket.RemoteEndPoint).Address.ToString();
               lock (connections) connections.Add(connection);
             IPHostEntry hostName = Dns.GetHostEntry(orionIP);
               machineName = hostName.HostName;
               lock (connections) connections.Add(connection);
                //count client connected
              connection_number = Interlocked.Increment(ref connection_count);

              //start receive -> error here 
   connection.socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length,
                  SocketFlags.None, new AsyncCallback(ReceiveCallBack), connection);

            //start new accept 
             serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);

          }//end try 
          catch (SocketException ex)
          { //later log files for error events  - > ex.SocketErrorCode
              string path = "eventlogs.txt";
              //create error log files to write error here 
              File.WriteAllText(path, ex.ToString());
              CloseConnection(connection);
          }
          catch (Exception exp)
          {
              string path = "eventlogs.txt";
              //create error log files to write error here 
              File.WriteAllText(path, exp.ToString());
              CloseConnection(connection);
              // log error file later ("Socket Exception:" + exp.ToString());
          }
     }
发生异常时,我没有对其进行重大修改。我按照所有说明操作,其他人也遇到同样的问题,例如关闭防火墙、maxusePort、检查网络连接和设备(如果配置正确)、缓冲区大小。我还检查了可能要处理的竞争条件和WSAECONNABORTED问题

与这个问题有关的人能给我一些额外的解决方案吗?任何额外的知识都会有很大的帮助

接收回拨


如果当前接受的连接出现网络错误,则不接受新连接。将BeginAccept移动到单独的try/catch

public void AcceptCallback(IAsyncResult result)
{ 

    ConnectionInfo connection = new ConnectionInfo();
    try
    {
        long connection_number;

        Socket s;
        s = (Socket)result.AsyncState;
        connection.socket = s.EndAccept(result);
        connection.socket.Blocking = false;
        connection.Buffer = new byte[10000]; //1kb buffer minimum


        orionIP = ((IPEndPoint)connection.socket.RemoteEndPoint).Address.ToString();
        lock (connections) connections.Add(connection);
        IPHostEntry hostName = Dns.GetHostEntry(orionIP);
        machineName = hostName.HostName;
        lock (connections) connections.Add(connection);
        connection_number = Interlocked.Increment(ref connection_count);

        connection.socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length,
        SocketFlags.None, new AsyncCallback(ReceiveCallBack), connection);
    }
    catch (SocketException ex)
    {
        string path = "eventlogs.txt";
        File.WriteAllText(path, ex.ToString());
        CloseConnection(connection);
    }
    catch (Exception exp)
    {
        string path = "eventlogs.txt";
        File.WriteAllText(path, exp.ToString());
        CloseConnection(connection);
    }

    try
    {
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);
    }
    catch (Exception exception)
    {
        //failed to accept. shut down service.
    }
}

我已经做了您建议的更改,但套接字异常仍然存在。当我将设备与主机分离时,碰巧收到了这个异常,实际上我正在使用超级终端来测试发送请求功能。似乎连接已经建立,客户端可以连接,但当将一些数据传输回服务器时,它会关闭连接并丢失其他数据包。然后,我认为问题不在AcceptCallback中,而是在receive callback中receive callback中可能出了什么问题。这是我的密码:对不起,我只是有一些互联网连接问题。这是我的接收回调代码。尝试{ConnectionInfo connection=ConnectionInfo结果.AsyncState;int bytesRead=connection.socket.EndReceiveresult;如果bytesRead>0{lock serverlock{connection.sb.AppendEncoding.UTF8.GetStringconnection.Buffer,0,bytesRead;}锁定连接{foreach ConnectionInfo conn in connections{if connection!=conn{conn.socket.Sendconnection.Buffer,bytesRead,SocketFlags.None;}}connection.socket.BeginReceiveconnection.Buffer,0,connection.Buffer.Length,SocketFlags.None,//新建AsyncCallbackReceiveCallBack,连接;connection.socket.BeginReceiveconnection.Buffer,0,新建AsyncCallbackReceiveCallBack,连接;}
public void AcceptCallback(IAsyncResult result)
{ 

    ConnectionInfo connection = new ConnectionInfo();
    try
    {
        long connection_number;

        Socket s;
        s = (Socket)result.AsyncState;
        connection.socket = s.EndAccept(result);
        connection.socket.Blocking = false;
        connection.Buffer = new byte[10000]; //1kb buffer minimum


        orionIP = ((IPEndPoint)connection.socket.RemoteEndPoint).Address.ToString();
        lock (connections) connections.Add(connection);
        IPHostEntry hostName = Dns.GetHostEntry(orionIP);
        machineName = hostName.HostName;
        lock (connections) connections.Add(connection);
        connection_number = Interlocked.Increment(ref connection_count);

        connection.socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length,
        SocketFlags.None, new AsyncCallback(ReceiveCallBack), connection);
    }
    catch (SocketException ex)
    {
        string path = "eventlogs.txt";
        File.WriteAllText(path, ex.ToString());
        CloseConnection(connection);
    }
    catch (Exception exp)
    {
        string path = "eventlogs.txt";
        File.WriteAllText(path, exp.ToString());
        CloseConnection(connection);
    }

    try
    {
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState);
    }
    catch (Exception exception)
    {
        //failed to accept. shut down service.
    }
}