zoukankan      html  css  js  c++  java
  • socket的一个错误的解释SocketException以及其他几个常见异常

    写socket程序有可能会遇见这个问题

     其他信息: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。 
    这种情况我的 错误原因:使用了监听的socket执行了接受数据的任务 
    代码:
          public void SetSocket()
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                socket.Bind(new IPEndPoint(IPAddress.Parse(this.txtIp.Text), int.Parse(this.txtPoint.Text)));
    
                socket.Listen(10);
    
                ThreadPool.QueueUserWorkItem(new WaitCallback(SendInfoOfService), socket);
    
            }
            //接收连接请求,使用线程调用接受客户短信息的方法
            public void SendInfoOfService(object socket)
            {
                var proxSocket = (Socket)socket;
                while (true)
                {
                    var serverSocket = proxSocket.Accept();
                    clientSocket.Add(serverSocket);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(ReciveInfo), serverSocket);
                }
            }

    之前是在线程池里面的队列里传递了一个监听的socket作为参数,到了接收信息的方法里面我没有再重新创建一个接收数据的线程,所以就引发了这个错,现在加入了

     var serverSocket = proxSocket.Accept();这个并且把这个监听线程作为参数传递下去到这个方法里:
            //接受客户短信息
            public void ReciveInfo(object socket)
            {
                var proxSocket = (Socket)socket;
    
                byte[] data = new byte[1024 * 1024];
                while (true)
                {
                    int i = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
                    if (i <= 0)
                    {
                        proxSocket.Shutdown(SocketShutdown.Both);
                        proxSocket.Close();
                        clientSocket.Remove(proxSocket);
                        return;
                    }
                    string str = Encoding.Default.GetString(data, 0, i);
                    this.txtContent.Text = str;
                }
            }

    问题解决

     此外,还有几个地方需要使用try catch去处理,防止异常,
    1、防止用户异常退出,在接收数据的信息里面如果发送的字节是0则表示用户退出,为了防止推出异常,加入如下代码,这个异常的处理应该在客户端和服务器端都写上
                    int len = 0;
                    try
                    {
                        len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
                    }
                    catch (Exception ex)
                    {
                        //异常退出
                        AppendTextToTxtLog(string.Format("服务器端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
                        StopContnet();//关闭连接
                        return;
                    }
    
                    if (len <= 0)
                    {
                        //客户端正常退出
                        AppendTextToTxtLog(string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
    
                        StopContnet();//停止连接
    
                        return;//让方法结束,终结当前接受客户端数据的异步线程。
                    }
    

      2、防止关闭Socket的时候出现异常,等1秒之后如果还不关闭出现异常的话,加入如下代码

       //关闭Socket
            public void StopConn() 
            {
                if(clientSocket.Connected)
                {
                    try
                    {
                        clientSocket.Shutdown(SocketShutdown.Both);
                        clientSocket.Close(100);
                        return;
                    }
                    catch (Exception)
                    {
                        
                        throw;
                    }
                }
            }
    

      3、为了防止客户端连接服务器端失败,可以加入如下方法

     try
                {
                    socket.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPoint.Text));
                }
                catch (Exception)
                {
                     MessageBox.Show("败了,重新连接");
                    //Thread.Sleep(500);
                    //btnConnect_Click(this,e);//睡眠0.5S之后重新调用这个控件的方法,相当于重新连接
                    return;
                }
    

      



  • 相关阅读:
    python3 爬取西祠代理IP数据
    电影天堂电影链接爬取
    腾讯招聘信息爬取
    妹子图图片爬取
    我爱我家数据爬取
    今日头条网页图片爬取
    快乐的正则一只
    百思不得姐首页爬取
    雪球网数据爬取
    Python Day79 form表单
  • 原文地址:https://www.cnblogs.com/llcdbk/p/4139205.html
Copyright © 2011-2022 走看看