CSocket как перестать слушать - PullRequest
2 голосов
/ 16 ноября 2011

Итак, у меня есть прослушивание CSocket в рабочем потоке, оно будет принимать блокировку, а затем вращать другой поток (да, я знаю, что производительность не является проблемой) для каждого нового соединения.

Как можно перестать слушать? Вы не можете вызвать его близко от другого потока, потому что CSocket выбросит утверждение.

Какое-нибудь быстрое исправление или просто выбросить эту ужасную, плохо спроектированную оболочку?

1 Ответ

0 голосов
/ 16 ноября 2011

Из MSDN:

Если вы хотите обработать это соединение в другом потоке, просто передача объекта MFC в поток не будет работать правильно. к правильно настроить все для соединения, которое будет обрабатываться в другой поток, требуются следующие шаги:

  1. Отсоедините дескриптор сокета от объекта CAsyncSocket в потоке, где было принято соединение.
  2. Передайте ручку гнезда на резьбу.
  3. В потоке присоедините этот дескриптор к производному объекту CAsyncSocket.

Если вы создаете программу, критичную для производительности, я бы лично использовал IOCP .

Код будет выглядеть примерно так:

Accept(ClientSocketObject, ... );
SOCKET s = ClientSocketObject.Detach();
CreateThread( ... ,(LPVOID)s, ...);

В вашей теме процедура,

ThreadProc( SOCKET s ){
CAsyncSocket clientSocket;
clientSocket.Attach( s );
...