Reputation: 71
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.
Upvotes: 0
Views: 536
Reputation: 12546
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));
}
}
Upvotes: 1