Asynchronous server socket multiple clients

前端 未结 2 428
别那么骄傲
别那么骄傲 2020-12-02 10:57

I have been working with the following code published on msdn:

http://msdn.microsoft.com/en-us/library/fx6588te.aspx

I understand that the server application

相关标签:
2条回答
  • 2020-12-02 11:30

    [Update 2014]: It seems that the example has been modified since this answer was posted, as noted in this thread. The MSDN example now handles multiple incoming connections properly. Anyway, the general approach described here is correct and perhaps it can provide additional clarification.


    When doing socket communication, you basically have a single listener socket for all incoming connections, and multiple handler sockets for each connected client.

    Listening to incoming connections

    When you start listening to a port, you create a socket with a callback method for incoming connections (this is referencing the example you mentioned). That's the one-and-only listener socket for that port number:

    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
    

    This line tells the listener to invoke the AcceptCallback method whenever a new client is connected (new connection callback). That method is the one which should do its work quickly, since it blocks other incoming connections.

    Creating dedicated handler sockets

    That is also why AcceptCallback must immediately create a dedicated "handler" socket with its own background data callback method (ReadCallback):

    // inside AcceptCallback, we switch to the handler socket for communication
    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
        new AsyncCallback(ReadCallback), state); // fired on a background thread
    

    From that moment on, ReadCallback method is invoked whenever some data is received by your newly connected client.

    Also, before returning, AcceptCallback needs to call listener.BeginAccept again, to continue listening to new incoming connections:

    // this is the same server socket we opened previously, which will now 
    // continue waiting for other client connections: it doesn't care about
    // the actual data transmission between individual clients
    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
    

    This part is omitted from the MSDN example, meaning it can only receive a single connection.

    Receiving data

    As soon as you get a packet of data from your client, ReadCallback method will be invoked. So, inside this data callback method, you need to read and process the received data, and then invoke the same BeginReceive method again (again, with ReadCallback as its data callback method).

    [Edit]

    The problem with MSDN example is that it allows connection of only a single client (listener.BeginAccept is called only once). To allow mulitple concurrent connections, you need to create a receive socket using handler.BeginReceive, and then call listener.BeginAccept to start listening to new clients.

    0 讨论(0)
  • 2020-12-02 11:37

    Every socket will have a listen queue associated with it. This will have the pending/partially accepted incoming connections. The max number number of pending connections can be defined programmatically in listen() API, which is nothing but 'listener.Listen(100)' in this example. Having had this as 100 here, the socket 'listener' can have 150 (=2*100/2) pending connections in the listen queue.

    0 讨论(0)
提交回复
热议问题