Многократный клиент Сокета, соединяющийся с сервером - PullRequest
0 голосов
/ 29 марта 2011

Я разрабатываю приложение симулятора, в котором приложение запускает многократное сокетное соединение (около 1000 соединений) с сервером. Я не хочу запускать столько потоков, чтобы обрабатывать эти соединения, так как система не может обработать столько клиентов. Использование Select не имеет смысла, так как мне нужно перебрать 1000 соединений, которые могут быть медленными. Пожалуйста, предложите мне, как справиться с этим сценарием.

Ответы [ 2 ]

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

Вы хотите использовать асинхронный ввод / вывод с портом завершения ввода / вывода (IOCP).

Это слишком много, чтобы объяснить в ближайшее время, но любое приложение Windows, которое должно поддерживатьбольшое количество одновременных сокетов должно использовать IOCP.

IOCP - это, по сути, Windows-потокобезопасная рабочая очередь.Вы помещаете «пакет завершения» в IOCP, а затем другой поток удаляет его из очереди и работает с ним.

Вы также можете связать многие типы дескрипторов, которые поддерживают перекрывающиеся операции, такие как сокеты, с IOCP.Когда вы связываете дескриптор с IOCP, перекрывающиеся операции, такие как WSARecv, автоматически отправляют пакет завершения на связанный IOCP.

Таким образом, по сути, вы можете иметь один поток, обрабатывающий все 1000 соединений.Каждый сокет будет создан как перекрывающийся сокет, а затем будет связан с вашим IOCP.Затем вы можете позвонить WSARecv на все 1000 сокетов и подождать, пока завершающий пакет станет доступным.Когда данные получены, операционная система отправит пакет завершения на соответствующий IOCP.Он будет содержать соответствующую информацию, например, сколько данных было прочитано и буфер, содержащий данные.

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

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

...