分析应该是客户端异常断开导致 怎么处理这个异常不影响其他客户端连接呢?
private Socket _socket;
private void OnAccept(IAsyncResult ar)
{
try
{
Socket new_accept = _socket.EndAccept(ar); //新连接socket
ProxySocket proxy = GetProxy(new_accept); //创建代理socket
proxy.DisConnected += new DisConnectedEventHandler(proxy_DisConnected); //离线事件
proxy.MessageReceived += new MessageReceivedEventHandler(proxy_MessageReceived); //接收数据事件
proxy.StartReceive(); //代理socket开始接收数据
if (Connected != null)
{
Connected.BeginInvoke(proxy, null, null); //Connected事件
}
_socket.BeginAccept(new AsyncCallback(OnAccept), _socket); //开始下一次异步侦听
}
catch (Exception ex)
{
}
}
4 个解决方案
#1
断开时receive会接收到0长度的数据,所以要判断一下
#2
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}
#3
“远程主机强制关闭一个现有的连接”
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。
#4
多线程处理,强制关闭就结束这个线程,链接其他的用户
#1
断开时receive会接收到0长度的数据,所以要判断一下
#2
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}
#3
“远程主机强制关闭一个现有的连接”
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。
真的是另一端管别了
看下客户端是不是数据发送完就主动关闭了连接,TCP是需要有确定信息的,这种发送端无法确定数据是否被完整接受,不应该主动关闭。
#4
多线程处理,强制关闭就结束这个线程,链接其他的用户