C# 异步套接字服务器侦听多个地址
我需要一个异步套接字服务器,侦听多个IP地址。基本上,我想做的是将此循环转换为多个地址:C# 异步套接字服务器侦听多个地址,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我需要一个异步套接字服务器,侦听多个IP地址。基本上,我想做的是将此循环转换为多个地址: while (true) { // Set the event to nonsignaled state. allDone.Reset(); // Start an asynchronous socket to listen for connections. Console.WriteLine(
while (true) {
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener );
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
在C语言中,我可以使用WSAAsyncSelect和FD#u ACCEPT消息来处理它,或者我可以使用IO完成端口,但在C语言中,我迷路了,也许我没有向谷歌提出正确的问题,因为我没有发现任何有用的东西。请帮忙
这段代码是从我所基于的示例中复制的,您可以找到它 我相信您所要求的是在没有环路的情况下接受多个连接 诀窍是在回调中使用调用BeginAccept 如下所示:
StartListening(){
listener.Bind(localEndPoint);
listener.Listen(100);
GetNewConnection(listener);
}
private GetNewConnection (Socket listener){
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(new AsyncCallback(OnNewConnection),
listener);
}
private OnNewConnection(IAsyncResult ar){
Socket listener = (Socket) ar.AsyncState;
Socket handler = listener.EndAccept(ar);
GetNewConnection(listener);
//...
}
Handler是远程IP的套接字,其中可以有许多
编辑:您当然可以创建call
GetNewConnection
,使用任意多个不同的侦听器,如果它们需要绑定到其他地址。您可以使用Task.Factory.fromsync
创建一个async
方法,然后使用该方法创建所有连接任务,然后在循环中启动所有连接任务,然后调用Task.WaitAll
以等待建立所有连接。请注意,Task.WaitAll
是一个阻塞调用,如果需要异步调用,请使用Task.whalll
因此,也许类似的东西可以完成这项工作(未经测试,但可以编译)
publicstaticvoidconnect(列出IP地址)
{
var listeners=新列表();
var tasks=新列表();
foreach(IP地址中的变量IP地址)
{
IPEndPoint localEndPoint=新IPEndPoint(ipAddress,11000);
套接字侦听器=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
添加(侦听器);
Bind(localEndPoint);
听,听(100);
添加(AcceptTaskAsync(侦听器));
}
Task.WaitAll(tasks.ToArray());
}
公共静态异步任务AcceptTaskAsync(套接字侦听器)
{
返回wait Task.Factory.fromsync(listener.beginacept、listener.EndAccept、TaskCreationOptions.denychildatach);
}
public static void Connect(List<IPAddress> ipAddresses)
{
var listeners = new List<Socket>();
var tasks = new List<Task<Socket>>();
foreach (var ipAddress in ipAddresses)
{
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
listeners.Add(listener);
listener.Bind(localEndPoint);
listener.Listen(100);
tasks.Add(AcceptTaskAsync(listener));
}
Task.WaitAll(tasks.ToArray());
}
public static async Task<Socket> AcceptTaskAsync(Socket listener)
{
return await Task<Socket>.Factory.FromAsync(listener.BeginAccept, listener.EndAccept, TaskCreationOptions.DenyChildAttach);
}