beginAccept()C#中的异步服务器问题

时间:2013-09-01 09:17:21

标签: c# sockets asynchronous

我正在努力处理一些简单的代码。但是,我无法完成它。我有这个服务器,它必须接受来自多个客户端的连接(显然是异步的)。所以,我有:

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8082);

TcpListener tcpListener = new TcpListener(IPAddress.Any, 8082);

server = tcpListener.Server;
server.Bind(ipEndPoint);
server.Listen(4);

server.BeginAccept(new AsyncCallback(beginConnection), server);

static void beginConnection(IAsyncResult iar)
{
    Console.WriteLine("Client connected");
    Socket s = (Socket)iar.AsyncState;
    server = s.EndAccept(iar);

    server.Listen(4);
    server.BeginAccept(beginConnection, s);
}

然后,当我尝试连接自己时,第一个客户端工作正常。它只是向该服务器发送一条消息,然后服务器将其发送回客户端。服务器充当回声。但是,当我尝试连接其他客户端时,它不起作用。我也把Console.WriteLine(“客户端连接”),但服务器没有写任何东西。 我该如何解决这个问题?

我想我没有将正确的参数传递给第一个BeginAccept方法。我应该传递tcpListener而不是服务器套接字。

然后我会:

static void beginConnection(IAsyncResult iar)
{
    Console.WriteLine("Client connected");
    TcpListener tcpListener = (TcpListener)iar.AsyncState;
    Socket s = tcpListener.Server.EndAccept(iar);

    tcpListener.Server = s; // But I would have this error

    server.Listen(2);
    server.BeginAccept(beginConnection, s);
}

但我会错误地将其标记出来。在第一个版本中没有任何修改,所以我认为这是代码的第一个版本中的问题。

1 个答案:

答案 0 :(得分:2)

首先,您不需要Server的{​​{1}}属性。即使没有TcpListener,您也应该致电Start()

其次,还应在Bind调用EndAccept()并返回TcpListener实例,您必须使用该实例发送和接收数据。

我刚才所说的一个简单例子可能会显示为:

TcpClient