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;
            }

  



免责声明:文章转载自《socket的一个错误的解释SocketException以及其他几个常见异常》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux-(rcp,scp)Android中xml设置Animation动画效果详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

socket测试3

20191218 2021-2022-1-diocs-socket测试-3 服务器端 编写好服务器端程序,开启13端口,等待客户机连接 客户端 绑定服务器IP,选择13号端口 服务器端和客户端同步 我编写的代码服务器端会每隔一秒响应时间请求(即屏幕中有多少条记录即查看了多少次时间) 客户端 服务器端 多客户端访问 之前的客户端是用的OpenEuler...

Libevent:6辅助函数以及类型

在头文件<event2/util.h>中定义了许多有用的函数和类型来帮助实现可移植的程序。Libevent在内部使用这些类型和函数。 一:基本类型 evutil_socket_t 除了Windows之外的大多数系统,socket就是一个整数,而且操作系统按照数值顺序对它们进行处理。而在Windows socket API中,socket是SO...

python socket编程介绍

一、概述 socket 通常被称作“套接字”,用于描述IP地址和端口,是通讯链的句柄,应用程序通过socket向网络发送请求或者回应网络的请求。 socket起源于UNIX,在linux、UNIX中“一切皆文件”,对于文件用 打开、读写、关闭 模式来操作。socket就是该模式的一个实现,是一种特殊的文件。一些socket函数就是对其进行的操作(读IO、写...

网络编程之Socket代码实例

网络编程之Socket代码实例 一、基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name meaning all available interfaces PORT = 50007 # A...

Socket 之 c#实现Socket网络编程

一、命名空间: 在网络环境下,最有用的两个命名空间是System.Net和System.Net.Sockets。 1、System.Net:通常与较高程的操作有关,例如download或upload,试用HTTP和其他协议进行Web请求等等 2、System.Net.Sockets:所包含的类通常与较低程的操作有关。如果要直接使用Sockets或者TCP/...

一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket

既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作.其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言和程序类型,比如:pascal,c,c++,delphi,vc,java,kjava,symbian .... objectc,ios ..直到最近还因为工作的关系还...