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;

            }

  



你可能感兴趣的:(exception)