[英]Async Sockets in C#
我正在嘗試基於異步套接字編寫簡單的客戶端服務器應用程序。 一切正常,直到我嘗試連接多個客戶端。 它們連接良好,但是只有“最新的”可以將數據發送到服務器,其他的則拋出異常:
“未返回IAsyncResult對象”
這是我的AcceptCallback代碼:
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);
}
}
任何想法有什么問題嗎? 我正在學習,因此可能有些愚蠢而明顯,但我看不到。
通過分配_clientSocket = _serverSocket.EndAccept(AR);
您松開了之前的_clientSocket
;
我將按照以下方式更改您的代碼(要點是在ObjectState參數中傳遞套接字,緩沖區等必需的信息)。
請參閱BeginXXX方法的ObjectState參數。
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));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.