Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步套接字服务器侦听多个地址_C#_Sockets_Asynchronous - Fatal编程技术网

C# 异步套接字服务器侦听多个地址

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(

我需要一个异步套接字服务器,侦听多个IP地址。基本上,我想做的是将此循环转换为多个地址:

        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);
}