正确的方法来停止侦听Socket

时间:2009-01-16 22:47:04

标签: c# sockets

我有一个侦听套接字连接的服务器:

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()方法中

?或者还有其他工作需要干净地关闭连接吗?

7 个答案:

答案 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()通常仅在您打算重新连接同一套接字时使用。