Я разрабатываю приложение, имеющее один TCP-сервер и несколько UDP-серверов/слушателей. Каждый сервер представляет собой отдельный поток, такой же, как рабочие потоки для установленных TCP-соединений. Я вызываю WSAStartup() в каждом из потоков.Может ли вызов WSAStartup() из нескольких потоков вызвать тупик?
Иногда вызов WSAStartup() висит (он выглядит как тупик для меня). Ниже приведена трассировка стека:
[email protected]()
[email protected]() + 0xc bytes
[email protected]() + 0x8c bytes
[email protected]() + 0x46 bytes
[email protected]() + 0x17d bytes
[email protected]() + 0x18 bytes
[email protected]() + 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
[email protected]() + 0xa7 bytes
Этот тупик случается во время разрыва инициализации. Я вижу, что TCP-сервер запущен и установлено одно TCP-соединение, а запускается только один из UDP-серверов. Трассировка стека - это функция, которая должна инициировать остальные UDP-серверы. Я предполагаю, что, хотя я пытаюсь инициализировать UDP-сервер и вызывать WSACStartup(), другой протектор обрабатывает другую операцию сокета, например новое TCP-соединение, а также вызывает WSAStartup()?
Мой вопрос: может ли вызвать WSAStartup() из нескольких потоков вызвать этот тупик? Также я проверил, что WSACleanup() вызывается перед тупиком, и это не так. Исполнение никогда не достигает WSACleanup().
Я знаю, что только один вызов WSAStartup должно быть достаточно, но требующие WSAStartup() несколько раз, не должно быть проблемой (MSDN] 1): «Приложение может вызвать WSAStartup несколько раз, если это необходимо получить информацию о структуре WSADATA более одного раза ". Следовательно, я хотел бы установить, вызван ли этот тупик WSAStartup() или чем-то еще.
Это не ответ на ваш вопрос, но вы рассмотреть вопрос об использовании наддува ASIO (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)?У меня было намного легче решать такие проблемы, как ваша, с этой библиотекой. – nabulke
Николай, я использовал импульс раньше и как он. Поскольку я начал это приложение с WinSock, я хотел бы разобраться в этом вопросе. Просто любопытно, я думаю :) –
Вы посмотрели на столы вызовов ваших других потоков? –