【问题标题】:Determine the number of incoming connections in a socket's queue确定套接字队列中的传入连接数
【发布时间】:2016-06-09 05:19:23
【问题描述】:

MSDN 谈到Socket.Listen 方法:

Listen 导致... Socket 监听传入的连接尝试。 backlog 参数指定可以排队等待接受的传入连接数...使用 Accept 或 BeginAccept 接受来自队列的连接。

这意味着套接字会将传入的连接放入队列中。我们如何确定排队的连接数?

var localEndPoint = new IPEndPoint(IPAddress.Any, Port);

var serverSocket = new Socket(
    AddressFamily.InterNetwork,
    SocketType.Stream,
    ProtocolType.Tcp);

serverSocket.Bind(localEndPoint);

// listen for incoming connections; queue `socketBacklog` of them
// Listen bit.ly/21vz22b
serverSocket.Listen(socketBacklog);

// how do we do this?
serverSocket.CountQueuedConnections()

我尝试过的一件事显然不起作用,那就是serverSocket.Poll(timeToWait, SelectMode.SelectRead)。这总是返回false

【问题讨论】:

    标签: c# .net sockets network-programming


    【解决方案1】:

    以 MSDN 的 Socket Code Examples 为例:

    Asynchronous Server Socket Example

     Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );
    
        // Bind the socket to the local endpoint and listen for incoming connections.
        try {
            listener.Bind(localEndPoint);
            listener.Listen(100);
    
            while (true) {
                // Set the event to nonsignaled state.
                allDone.Reset();
    
                // Start an asynchronous socket to listen for connections.
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept( 
                    new AsyncCallback(AcceptCallback),
                    listener );
    
                // Wait until a connection is made before continuing.
                allDone.WaitOne();
            }
    
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
    

    在这段代码中,您可以轻松地在无限循环中添加一个计数器来确定有多少客户端连接到服务器。

    Socket.Listen Method (Int32) 只提供了可以连接到此 ServerSocket 的最大客户端数。另外,Listen 不会阻塞。

    【讨论】:

    • 那么,我是否理解我们必须Accept 一个连接才能将其计入队列?
    • @ShaunLuttin - 是的,您需要接受连接,这会导致将连接推送到队列中。然后,您可以在 accept() 之后的下一行增加您的计数器。
    • 啊哈。因此,接受连接会将其放入队列中。我的印象是接受连接会将其从队列中移出。我错了吗?
    • @ShaunLuttin - 关闭连接会将其从队列中释放。所以,是的,在此评论之前,您的印象是错误的:D
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2012-03-29
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多