简体   繁体   中英

Async Sockets in C#

I'm trying to write simple client-server app, based on async sockets. Everything works fine untill I try to connect multiple clients. They are connecting well, but only the "newest one" can send data to server, others throw exception:

"IAsyncResult object was not returned"

Here is my AcceptCallback code:

private void AcceptCallback(IAsyncResult AR)
{
    try
    {
        _clientSocket = _serverSocket.EndAccept(AR);
        _buffer = new byte[_clientSocket.ReceiveBufferSize];
        _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        Console.WriteLine("Client connected!");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Any ideas what's wrong? I'm learning so it might be something stupid and obvious, but I don't see it.

By assigning _clientSocket = _serverSocket.EndAccept(AR); You loose the previous _clientSocket ;

I would change your code as follows (main point is passing the necessary info like socket,buffer etc in ObjectState parameters).

See the ObjectState parameters of BeginXXX methods.....

var tcpListener = new TcpListener(IPAddress.Any, 8088);
tcpListener.Start();
tcpListener.BeginAcceptSocket(AsyncAccept, tcpListener);

.......

void AsyncAccept(IAsyncResult ar)
{
    var tcpListener = (TcpListener)ar.AsyncState;
    var socket = tcpListener.EndAcceptSocket(ar);
    if (ar.IsCompleted)
    {
        Console.WriteLine(socket.RemoteEndPoint + " connected...");
        var buf = new byte[0x10000];
        socket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, AsyncRead, new Tuple<Socket, byte[]>(socket, buf));

        tcpListener.BeginAcceptSocket(AsyncAccept, tcpListener);
    }
}

void AsyncRead(IAsyncResult ar)
{
    var tuple = (Tuple<Socket, byte[]>)ar.AsyncState;
    var socket = tuple.Item1;
    var buf = tuple.Item2;

    if (ar.IsCompleted)
    {
        var len = socket.EndReceive(ar);
        var str = Encoding.UTF8.GetString(buf, 0, len);
        Console.WriteLine(socket.RemoteEndPoint + ":" + str);

        socket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, AsyncRead, new Tuple<Socket, byte[]>(socket, buf));
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM