Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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,有人能解释一下c#中的异步套接字吗?我刚刚遵循了MSDN的示例,下面是我的部分代码: public void Start() { serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); serverSocket.SetSocketOp

有人能解释一下c#中的异步套接字吗?我刚刚遵循了MSDN的示例,下面是我的部分代码:

public void Start()
{
    serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
    serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 10000);
    serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 10000);
    serverSocket.Listen(1000);
    while (!stop)
    {
        Console.WriteLine("Server Thread #" + Thread.CurrentThread.ManagedThreadId);
        allDone.Reset();
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
        allDone.WaitOne();
    }
}
private void AcceptCallback(IAsyncResult ar)
{
    allDone.Set();

    Socket serverSocket = (Socket)ar.AsyncState;
    Socket clientSocket = serverSocket.EndAccept(ar);

    Console.WriteLine("Client Thread #" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(100000); <----- All request is stopped, no response returned.

    // ....
}
public void Start()
{
serverSocket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
绑定(新的IPEndPoint(IPAddress.Any,port));
serverSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,10000);
serverSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,10000);
serverSocket.Listen(1000);
当(!停止)
{
Console.WriteLine(“服务器线程#”+Thread.CurrentThread.ManagedThreadId);
全部完成。重置();
BeginAccept(新的异步回调(AcceptCallback),serverSocket);
全部完成。WaitOne();
}
}
私有void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
套接字服务器套接字=(套接字)ar.AsyncState;
Socket clientSocket=serverSocket.EndAccept(ar);
Console.WriteLine(“客户端线程#”+Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(100000);只要你打电话给

Socket clientSocket = serverSocket.EndAccept(ar);
您需要在服务器套接字上再次调用
beginacept
方法

因此,函数将如下所示:

private void AcceptCallback(IAsyncResult ar)
{
    allDone.Set();

    Socket serverSocket = (Socket)ar.AsyncState;
    Socket clientSocket = serverSocket.EndAccept(ar);
    serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);

    Console.WriteLine("Client Thread #" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(100000);

    // ....
}

只要你打电话给

Socket clientSocket = serverSocket.EndAccept(ar);
您需要在服务器套接字上再次调用
beginacept
方法

因此,函数将如下所示:

private void AcceptCallback(IAsyncResult ar)
{
    allDone.Set();

    Socket serverSocket = (Socket)ar.AsyncState;
    Socket clientSocket = serverSocket.EndAccept(ar);
    serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);

    Console.WriteLine("Client Thread #" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(100000);

    // ....
}

同样,在这种情况下,在
Start()
方法中不需要
while(!stop)
,只需要某种等待来确保主线程不会终止。否则,接受新连接有两点不明显。同样,在这种情况下,在
Start()中不需要
while(!stop)
method,只是某种等待,以确保主线程不会终止。否则,接受新连接有两点是不明显的。