我有一个侦听套接字连接的服务器:
public class Server
{
private Socket _serverSocket;
public Server()
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 1234));
_serverSocket.Listen(1);
}
public void Start()
{
_serverSocket.BeginAccept(HandleAsyncConnectionMethod, null);
}
public void Stop()
{
//????? MAGIC ?????
}
//... rest of code here
}
关闭套接字的正确(干净)方式是什么?
打电话是否足够:
_serverSocket.Disconnect(true);
在Stop()方法中?或者还有其他工作需要干净地关闭连接吗?
答案 0 :(得分:3)
TCP连接终止正确涉及四次握手。你希望两端都告知对方他们正在关闭,然后确认彼此关闭。
维基百科解释了这个过程:http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination
这篇文章解释了如何在C#中实现它:http://vadmyst.blogspot.com/2008/04/proper-way-to-close-tcp-socket.html
答案 1 :(得分:2)
由于您正在侦听传入的TCP连接,因此可以使用具有Stop()方法的System.Net.Sockets.TcpListener。但它没有异步操作。
答案 2 :(得分:2)
两种正确关闭它的方法
1)创建临时连接套接字并将其连接到监听套接字,这样它就可以触发其处理程序,然后用正常的EndAccept完成它,然后关闭它们。
2)只是关闭(0)侦听套接字,这将导致其回调的错误镜头,如果你然后查看你的侦听套接字,你将看到它的状态是“关闭”和“处置”。这就是调用EndAccept会导致异常的原因。您可以忽略它,不要调用EndAccept。听力套接字会立即关闭而不会超时。
答案 3 :(得分:0)
立即使用Accept调用break的最简单方法是调用_serverSocket.Dispose(); 对Shutdown或Disconnect之类的方法的任何其他调用都将引发异常。
答案 4 :(得分:-2)
应该处理它...但如果你需要绝对确定,你总是可以用火来杀死它:
Not for sockets, but same idea applies.,即以各种可能的方式关闭它,然后最终将套接字设置为null。
答案 5 :(得分:-2)
首先,您需要确保跟踪在BeginAccept过程中创建的任何客户端套接字。首先使用Socket.Shutdown()和Socket.Close()方法关闭它们。一旦这些都被关闭,那么在监听套接字上做同样的事情。
答案 6 :(得分:-3)
您应该使用Socket.Shutdown(),然后使用Socket.Close()。 Socket.Disconnect()通常仅在您打算重新连接同一套接字时使用。