求助 Socket异常 出现“远程主机强迫关闭了一个现有的连接“

时间:2021-08-03 02:25:04
用SOCKET异步的方式接收客户端数据,结果运行老是出现“远程主机强制关闭一个现有的连接”的问题。 导致服务器异常 其他客户端连接不上。
分析应该是客户端异常断开导致  怎么处理这个异常不影响其他客户端连接呢?


 private Socket _socket;

 private void OnAccept(IAsyncResult ar)
        {    
                try
                {
                     Socket new_accept = _socket.EndAccept(ar);  //新连接socket
                    ProxySocket proxy = GetProxy(new_accept);  //创建代理socket
                   
                    proxy.DisConnected += new DisConnectedEventHandler(proxy_DisConnected);   //离线事件
                    proxy.MessageReceived += new MessageReceivedEventHandler(proxy_MessageReceived); //接收数据事件
                    proxy.StartReceive();  //代理socket开始接收数据
                   
                            if (Connected != null)
                            {
                                Connected.BeginInvoke(proxy, null, null);  //Connected事件  
                            }
                        
                            
                            _socket.BeginAccept(new AsyncCallback(OnAccept), _socket);  //开始下一次异步侦听
                    }
                    catch (Exception ex)
                    {
                     


                    }

        }



4 个解决方案

#1


断开时receive会接收到0长度的数据,所以要判断一下

#2


求助 Socket异常 出现“远程主机强迫关闭了一个现有的连接“
 /// <summary>  
        /// 接收消息  
        /// </summary>  
        /// <param name="clientSocket"></param>  
        private static void ReceiveMessage(object clientSocket)
        {
            Socket myClientSocket = (Socket)clientSocket;
            while (true)
            {
                try
                {
                    //通过clientSocket接收数据  
                    int receiveNumber = myClientSocket.Receive(result);
                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    myClientSocket.Shutdown(SocketShutdown.Both);
                    myClientSocket.Close();
                    break;
                }
            }
        }

#3


“远程主机强制关闭一个现有的连接”
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。

#4


多线程处理,强制关闭就结束这个线程,链接其他的用户

#1


断开时receive会接收到0长度的数据,所以要判断一下

#2


求助 Socket异常 出现“远程主机强迫关闭了一个现有的连接“
 /// <summary>  
        /// 接收消息  
        /// </summary>  
        /// <param name="clientSocket"></param>  
        private static void ReceiveMessage(object clientSocket)
        {
            Socket myClientSocket = (Socket)clientSocket;
            while (true)
            {
                try
                {
                    //通过clientSocket接收数据  
                    int receiveNumber = myClientSocket.Receive(result);
                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    myClientSocket.Shutdown(SocketShutdown.Both);
                    myClientSocket.Close();
                    break;
                }
            }
        }

#3


“远程主机强制关闭一个现有的连接”
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。

#4


多线程处理,强制关闭就结束这个线程,链接其他的用户