C # Принятие сокетов в асинхронном режиме - лучшие практики - PullRequest
1 голос
/ 04 мая 2010

Как лучше всего принимать новые сокеты асинхронным способом.

Первый способ:

while (!abort && listener.Server.IsBound)
{  
  acceptedSocketEvent.Reset();  
  listener.BeginAcceptSocket(AcceptConnection, null);  

  bool signaled = false;  
  do  
  {  
     signaled = acceptedSocketEvent.WaitOne(1000, false);
  } while (!signaled && !abort && listener.Server.IsBound);
}

, где AcceptConnection должно быть:

private void AcceptConnection(IAsyncResult ar)
{
    // Signal the main thread to continue.
    acceptedSocketEvent.Set();

    Socket socket = listener.EndAcceptSocket(ar);
    // continue to receive data and so on...
    ....
}

или Второй способ:

listener.BeginAcceptSocket(AcceptConnection, null);
while (!abort && listener.Server.IsBound)
{  
   Thread.Sleep(500);
}

и AcceptConnection будет:

private void AcceptConnection(IAsyncResult ar)
{
    Socket socket = listener.EndAcceptSocket(ar);
    // begin accepting next socket
    listener.BeginAcceptSocket(AcceptConnection, null);
    // continue to receive data and so on...
    ....
}

Какой ваш предпочтительный способ и почему?

1 Ответ

1 голос
/ 04 мая 2010

мне очень нравится второй способ; продолжение «BeginAccept» из события, которое принимает соединение, кажется мне более читабельным. Вы даже можете присоединить сокет Listening к IAsyncResult и извлечь его в своем событии Accept, чтобы избежать использования глобальных переменных.

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