Пропущенные соединения с использованием select () на многих неблокирующих соединительных TCP-сокетах в Windows XP - PullRequest
0 голосов
/ 28 марта 2011

У меня есть небольшой портативный инструмент, который подключается к 150 серверам в разных местах, чтобы быстро проверить их состояние.Важно относительно быстро вернуть пользователю статус всех серверов, чтобы инструмент параллельно подключался к серверам, используя неблокирующее соединение, и использовал select () для определения готовности каждого сокета.Использование select () довольно простое, и инструмент в настоящее время готов к сбоям и хорошо работает в Linux.Он работает на Windows XP, но соединения с подавляющим большинством серверов там не завершены.Инструмент переключает вызовы для подключения, чтобы избежать создания того, что выглядит как поток SYN.К одному серверу подключается около 100 мсек.У меня также есть проверка, чтобы убедиться, что FD_SETSIZE не нарушен.У меня есть неподтвержденное свидетельство от кого-то другого, что поведение в более поздних версиях Windows лучше, но я не смог проверить.

Я использовал WinDump, чтобы проверить, что отправляются пакеты syn, и я вижупакеты возвращаются, но select () возвращает ноль, и код просто не может подключиться к большинству существующих серверов, и я могу подключиться к тому же коду в Linux.

ИмеетКто-нибудь видел и решал подобные проблемы со многими неблокирующими подключениями и выбирал на Windows XP?

1 Ответ

0 голосов
/ 29 марта 2011

После еще одного дня копания я, кажется, нашел ответ. В Windows XP SP2 существует ограничение в 10 одновременных подключаемых сокетов по всей системе. Если существует 10 или более наполовину открытых соединений, регистрируется системное событие, отмечающее, что предел был достигнут, и новые соединительные сокеты незаметно регулируются. Номер системного события - 4226.

Я исправил свой код, добавив проверки версий для Windows XP, и установил менее 10 подключений в этих системах. До сих пор у меня нет сообщений о влиянии других версий.

...