2009-02-16 5 views
0

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

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

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

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

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

Google is unhelpful returning 4 results of which none solve my problem.

Любые предложения?

ответ

1

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

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

+0

Я не использую ваш класс как есть, но он выглядит подозрительно. Существует фобия об использовании внешнего кода здесь, поэтому мне пришлось переписать его. Но как только идея засеяна, как вы можете ее распустить? Фактическая ошибка HRESULT находится в окне просмотра как @ err, hr. CleanUp никогда не возвращается. –

+0

Странно. Я этого никогда не видел. Разве что-то еще разгружает dll winsock до этого вызова? Есть ли у вас другие вызовы WSAStartup и WSACleanUp? Какая небольшая примерная программа демонстрирует проблему; и т. д. –

+0

Ничто иное не использует WinSock в коде, поэтому его не следует выгружать. Ничего не появляется в окне отладки, что указывает на его разгрузку. Что касается наименьшего примера, мне пришлось бы изучить его. –

0

мне было бы интересно узнать, что вы хотите найти, если вы использовали вес «след и смотреть данные» команду в окне отладчике:

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

 
bp ws2_32!wsacleanup 

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

 
wt -oa -oR @$ra 

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

+0

Хммм. Никогда не использовался отладчик окон. Когда я получу этот модуль, я сделаю некоторый рефакторинг. Если это не исправить, я попробую попробовать отладчик окон. На нем есть статья о codeproject iirc. –

+0

он мог точно определить вашу проблему. не зная архитектуры вашего программного обеспечения, трудно судить, но знание того, какой внутренний вызов (вызванный WSACleanup) терпит неудачу, будет определенным шагом вперед. – deemok

 Смежные вопросы

  • Нет связанных вопросов^_^