写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(); 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[ * ];
while (true)
{
int i = proxSocket.Receive(data, , data.Length, SocketFlags.None);
if (i <= )
{
proxSocket.Shutdown(SocketShutdown.Both);
proxSocket.Close();
clientSocket.Remove(proxSocket);
return;
}
string str = Encoding.Default.GetString(data, , 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以及其他几个常见异常的更多相关文章

  1. java的Socket通信例子及关于java.net.SocketException: Socket is closed错误

    今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...

  2. Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释

    另外http://www.cnblogs.com/fengmk2/archive/2007/01/15/using-Socket.html可供参考   一Java socket 说明 所谓socket ...

  3. linux socket读数据错误解释

    EINTR 表示某种阻塞的操作,被接收到的信号中断,造成的一种错误返回值. EAGAIN   从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作( ...

  4. Okhttp 多次调用同一个方法出现错误java.net.SocketException: Socket closed

    Okhttp 多次调用同一个方法出现错误java.net.SocketException: Socket closed https://blog.csdn.net/QQiqq1314/article/ ...

  5. Delphi 通信报Asynchronous socket error 10053错误的一个解决方法

    在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时, ...

  6. JMeter一个错误the target server failed to respond--JMeter坑

    问题:1.在测试一个http景象,特别是集波动TPS时刻,出现了一个错误.它现在是一个必须错误(压力顺利时却零星的错误,甚至很少见): 每次必现错误(開始一直怀疑是网络或程序的问题)   2.失败事务 ...

  7. Nodejs发送Post请求时出现socket hang up错误的解决办法

    参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...

  8. application Initialization设置导致处理程序ExtensionlessUrlHandler-Integrated-4.0在其模块列表中有一个错误模块问题的解决

    HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“Ma ...

  9. 命令行连接mysql服务器时 报Can't connect to local MySQL server through socket 'xxx.sock'错误

    本来之前用的好好的mysql服务器,突然就报Can't connect to local MySQL server through socket 'xxx.sock'错误了 遇到该问题思路首先是:检查 ...

随机推荐

  1. UVa 1593 (水题 STL) Alignment of Code

    话说STL的I/O流用的还真不多,就着这道题熟练一下. 用了两个新函数: cout << std::setw(width[j]);    这个是设置输出宽度的,但是默认是在右侧补充空格 所 ...

  2. php的session_start

    如果session使用cookie记录,那么在session_start时会设置一个cookie,参数取决于php.ini的设置,当然也可以通过session_set_param在程序里设置.不同站点 ...

  3. HDU 4750

    解题方法,,,首先应该可以看出来是一颗 最小生成树,任意一条的边的价值是不同的:所以计算出最小生成树的每一条边有多少对顶点满足他的 f 值就是这条边的 权值,因此可以在生成最小生成树的时候,进行一下统 ...

  4. JDBC用ResultSet访问大量数据时会遇到的问题

    我们经常需要JDBC来对数据库就行操作,一般流程为连接数据库.通过sql语句把需要的数据取出来保存到ResultSet,然后调用ResultSet方法的类似 getString,getInt()等方法 ...

  5. distinguish and differentiate

    According to Cambridge Dictionary distinguish:to recognize or understand the difference between two ...

  6. hdu 3951(博弈规律)

    题意:给定围成一个圈的硬币n枚,然后每次可以取出连续的1-k枚,谁取完最后一枚谁就获胜. 分析:对于第二个人当第一个人取完后,他可以取成对称的形式,所以第二个人必胜. 代码: #include< ...

  7. 自定义View(三)--实现一个简单地流式布局

    Android中的流式布局也就是常说的瀑布流很是常见,不仅在很多项目中都能见到,而且面试中也有很多面试官问道,那么什么是流式布局呢?简单来说就是如果当前行的剩余宽度不足以摆放下一个控件的时候,则自动将 ...

  8. [搜片神器]直接从DHT网络下载BT种子的方法

    DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr DHT系 ...

  9. cocos2dx 2.x 版本+Windows+ADT Bundle 配置

    昨天解决了cocos2dx 3.x版本+Windows+ADT Bundle的配置,今天来解决cocos2dx 2.x版本的配置. 整体来说,2.x的配置相对麻烦一点,不过一旦解决了,就一路畅通无阻了 ...

  10. Selenium2Library系列 keywords 之 _ElementKeywords

    #公有方法: (1)current_frame_contains(self, text, loglevel='INFO') (2)current_frame_should_not_contain(se ...