WSACleanUp вызывает исключение

Мое приложение может переключаться между последовательными и сокетными соединениями, но ни одно из них не может быть открыто одновременно. Поэтому, когда я пытаюсь переключиться между Socket и Serial, я удаляю соединение Socket.

Основанный на сокете объект использует закрытый класс UsesWinsock (большой крик Len Holgate здесь, поскольку это в основном его код (на самом деле это RAII, но я никогда не применял его к WSA, пока не увидел, как он это делает)). Это просто вызывает WSAStart и WSACleanUp.

Когда вызывается WSACleanUp, он переходит в NTDLL и ассемблер. @err,hr дает мне "Область данных, переданная системному вызову, слишком мала", как HRESULT.

Я попытался переместить код: перемещение класса в порядке его наследования приводит к изменению последовательности уничтожения и фактически нарушает функции, чтобы они были последними вызовами в последовательности уничтожения. Ни один не работал.

Я почти уверен, что освободил все, что выделено (есть только 1 сокет и пара событий), и я застрял - это довольно важная проблема для меня.

Google бесполезен, возвращая 4 результата, ни один из которых не решает мою проблему.

Какие-либо предложения?

2 ответа

Итак, вы используете мой класс UsesWinsock как есть? То есть ты говоришь, что он сломан? Если так, то электронное письмо напрямую ко мне может быть более эффективным способом решения проблемы;)

Я заметил, что мой код на самом деле не проверяет код возврата из WSACleanUp() в dtor, поэтому я предполагаю, что вы проверяете это, это SOCKET-ERROR, а WSAGetLastError() сообщает об ошибке ERROR-INSUFFICIENT-BUFFER?

Мне было бы интересно узнать, что бы вы нашли, если бы вы использовали команду wt "trace and watch data" в отладчике windows:

Установите точку останова в начале WSACleanup:

bp ws2_32! wsacleanup

После попадания выполните команду трассировки:

wt -oa -oR @ $ ra

и остерегайтесь звонков в ntdll!RtlSetLastWin32Error

Вы также можете опубликовать результаты здесь, было бы интересно посмотреть на них.

Другие вопросы по тегам