【发布时间】:2014-09-22 19:16:34
【问题描述】:
所以我知道有很多关于这个主题的文章,我确实阅读了很多我想说的但由于某种原因我确定我的代码没有做它应该做的事情。
我想关闭我的服务器和我的客户端之间的连接。 现在在服务器端我用这段代码开始断开连接
public void shutdown()
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
}
在客户端,我在理解如何断开连接时遇到了一些麻烦,我认为正在发生以下情况:在我的异步接收回调中,我应该收到一个错误,因为服务器启动了关闭序列,我必须处理那(对???)所以我的客户端代码如下所示: 接收回调:
private void ReceiveCallback(IAsyncResult result)
{
int bytesRecieved = 0;
byte[] tempBuff;
//Try to receive But if a Socket error occures disconnect otherwise start Receiving again
try
{
bytesRecieved = _socket.EndReceive(result);
}
catch (SocketException sockEx)
{
Disconnect(sockEx);
return;
}
catch (ObjectDisposedException disposeEx)
{
Disconnect(disposeEx);
return;
}
catch (Exception ex)
{
StartReceive();
return;
}
if (bytesRecieved == 0)
{
StartReceive();
return;
}
tempBuff = new byte[bytesRecieved];
Buffer.BlockCopy(_buffer, 0, tempBuff, 0, bytesRecieved);
StartReceive();
_packHandler.handlePacket(tempBuff);
}
断开连接:
public void Disconnect()
{
if (!_socket.Connected)
{
return;
}
_socket.BeginDisconnect(false, DisconnectCallback, null);
}
断开回调
private void DisconnectCallback(IAsyncResult result)
{
_socket.EndDisconnect(result);
_socket.Close();
}
(Disconnect 方法超载,所以如果我遇到异常,它会创建一个 messageBox,然后还会调用 Disconnect。这样我就知道发生了什么。)
我哪里错了,我可以改进什么???
我尝试了代码,它似乎可以工作,但我随后使用 netstat 查看是否所有套接字都已关闭并且客户端套接字没有。它在 FIN_WAIT_2 中,这意味着它(或服务器???)还没有发送 FIN 数据包,对吗? 哦,然后我又试了一次,换了这条线:
if (bytesRecieved == 0)
{
StartReceive();
return;
}
到
if (bytesRecieved == 0)
{
Disconnect;
return;
}
然后在服务器端和客户端抛出异常,客户端说连接已被服务器关闭???
编辑:即使我关闭了两个程序 Netstat 仍然显示端口处于等待状态。这告诉我什么?
【问题讨论】:
标签: c# sockets visual-studio-2013 .net-4.5 asyncsocket