WSASYSCALLFAILURE с перекрытием ввода-вывода в Windows XP - PullRequest
0 голосов
/ 16 июля 2010

Я столкнулся с ошибкой в ​​моем коде, которая использует результаты WSARecv и WSAGetOverlapped для перекрывающегося сокета. При большой нагрузке WSAGetOverlapped возвращает WSASYSCALLFAILURE («Системный вызов, который никогда не должен завершиться с ошибкой»), и мой поток TCP впоследствии не синхронизируется, что приводит к хаосу на верхних уровнях моей программы.

До сих пор мне не удавалось изолировать его от данного набора оборудования или драйверов. Кто-то тоже решил эту проблему и нашел решение или обходной путь?

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Сколько соединений, сколько ожидающих recvs, сколько отправляет аутсандинг? Что говорит perfmon или диспетчер задач об объеме используемого невыгружаемого пула? Сколько памяти в коробке? Это уходит, если вы запускаете программу на Vista или выше? У вас установлены LSP?

Возможно, вы исчерпали невыгружаемый пул и вызвали неправильную работу плохо написанного драйвера, если он не выделяет память. Эта проблема менее вероятна в Vista или более поздних версиях, поскольку объем доступного пула невыгружаемых страниц значительно увеличился (см. http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged-pool.html). В качестве альтернативы вы можете использовать ограничение «заблокированных страниц» (вы можете заблокировать только фиксированное количество страниц в памяти в ОС, и каждая ожидающая операция ввода-вывода блокирует одну или несколько страниц в зависимости от размера буфера и выравнивания распределения).

0 голосов
/ 22 июля 2010

Кажется, я решил эту проблему, перестав спать 1 мс и повторяя результат WSAGetOverlapped, когда он сообщает о WSASYSCALLFAILURE.

У меня была другая проблема, связанная с срабатыванием перекрывающихся событий, хотя нет данных, которые я такжедолжен был решить первым.Теперь тест выполняется более часа, и несколько WSASYSCALLFAILURE обрабатываются правильно.Надеемся, что и ночной тест также будет успешным.

@ Len: еще раз спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Ночной тест прошел успешно.Моя ошибка была вызвана двумя взаимозависимыми проблемами:

Проблема 1: WaitForMultipleObjects в ConnectionSet :: select иногда сигнализирует данные на пустом сокете, вызывая тупиковую блокировку SocketConnection :: readSync.Исправление: Выполните неблокирующее чтение первого байта каждого пакета.Сбросить ConnectionSet, если сокет был пустым

Проблема 2: WSAGetOverlappedResult иногда возвращает WSASYSCALLFAILURE, вызывая несинхронизацию в потоке TCP.Исправление: Повторите WSAGetOverlappedResult после небольшого периода сна.

http://equalizer.svn.sourceforge.net/viewvc/equalizer?view=revision&revision=4649

...