Я занимаюсь разработкой приложения, которое имеет один TCP-сервер и несколько UDP-серверов / прослушивателей. Каждый сервер является отдельным потоком, таким же, как рабочие потоки для установленных соединений TCP. Я вызываю WSAStartup () в каждом из потоков.
Иногда вызов WSAStartup () зависает (для меня это выглядит тупиком). Вот трассировка стека:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_ZwWaitForSingleObject@12() + 0xc bytes
ntdll.dll!_RtlpWaitForCriticalSection@4() + 0x8c bytes
ntdll.dll!_RtlEnterCriticalSection@4() + 0x46 bytes
ntdll.dll!_LdrpGetProcedureAddress@20() + 0x17d bytes
ntdll.dll!_LdrGetProcedureAddress@16() + 0x18 bytes
kernel32.dll!_GetProcAddress@8() + 0x3e bytes
vld.dll!03203723()
[Frames below may be incorrect and/or missing, no symbols loaded for vld.dll]
ws2_32.dll!CheckForHookersOrChainers() + 0x22 bytes
ws2_32.dll!_WSAStartup@8() + 0xa7 bytes
Этот тупик возникает во время инициализации. Я вижу, что TCP-сервер запущен и что установлено одно TCP-соединение, а запущен только один из UDP-серверов. Трассировка стека происходит от функции, которая должна инициировать остальные UDP-серверы. Я предполагаю, что в то время как я пытаюсь инициировать UDP-сервер и вызывать WSACStartup (), другой шаг обрабатывает другую операцию сокета, например, новое TCP-соединение, и также вызывает WSAStartup ()?
Мой вопрос заключается в том, может ли вызов WSAStartup () из нескольких потоков вызвать эту тупиковую ситуацию?
Также я проверил, вызывается ли WSACleanup () до тупика, и это не так. Выполнение никогда не достигает WSACleanup ().
Я знаю, что достаточно всего одного вызова WSAStartup, но вызов WSAStartup () несколько раз не должен быть проблемой (MSDN] 1 ):
«Приложение может вызывать WSAStartup более одного раза, если ему необходимо получить информацию о структуре WSADATA более одного раза».
Следовательно, я хотел бы установить, вызван ли этот тупик WSAStartup () или чем-то еще.