socket的⼀个错误的解释SocketException以及其他⼏个常见异
常
写socket程序有可能会遇见这个问题
其他信息: 由于套接字没有连接并且(当使⽤⼀个 sendto 调⽤发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
这种情况我的错误原因:使⽤了监听的socket执⾏了接受数据的任务
代码:
public void SetSocket()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Ip.Text), int.Point.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);
}
}
问题解决
此外,还有⼏个地⽅需要使⽤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);
error parse newclientSocket.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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论