C # определение сокета асинхронного сервера? - PullRequest
1 голос
/ 10 июля 2011

Может кто-нибудь объяснить асинхронный сокет в 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.

    // ....
}

Я поставил «Thread.Sleep (100000)» после serverSocket.EndAccept, и я обнаружил, что остальные запросы не принимаются,Это пример вывода:

  1. Если Thread.Sleep (100000) отключен / прокомментирован, консоль показывает:
    • Серверная нить # 10
    • Клиентская нить# 11
    • Серверная нить # 10
    • Клиентская нить # 11
    • Серверная нить # 10
    • Клиентская нить # 11
    • и т. Д.on ...
  2. Если включен Thread.Sleep (100000), консоль показывает:
    • Серверная нить # 10
    • Клиентская нить #11
    • ... Никакой другой клиентский запрос не был принят до того, как первый запрос был выполнен.

Любое объяснение этой ситуации?Спасибо

1 Ответ

1 голос
/ 10 июля 2011

Как только вы вызываете

Socket clientSocket = serverSocket.EndAccept(ar);

Вам необходимо снова вызвать ваш метод BeginAccept на сокете сервера.

Таким образом, функция будет выглядеть следующим образом:

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

    // ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...