2016-02-05 5 views
2

Я пытаюсь найти лучший способ обработки нескольких подключений к моему C++ TCP-серверу. Я наткнулся на epoll(), но, к сожалению, он доступен только для Linux, и я все делаю в Windows.Использование IOCP с send() и recv()

После некоторых исследований кажется, что лучший способ обработки сокетов в Windows - использование портов ввода-вывода ввода-вывода. Я бы хотел их использовать, однако клиентское приложение использует send() и recv() (я не могу это изменить), то есть мне также нужно использовать те же функции для отправки и получения данных от клиента. Эти функции, по-видимому, не используются для IOCP (WSASend()/WSARecv()).

Хотелось бы узнать, есть ли у меня возможность использовать IOCP с send() и recv()? Или мне нужно искать другие методы?

+0

проверить функцию select https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx – Vishwas

+0

Я действительно проверял ее, я ее читал «Это хорошо с множеством сокетов, и это моя главная забота, производительность. – Spook

ответ

2

Мне также нужно использовать одни и те же функции для отправки и получения данных от клиента

Это неправильно. Клиент не имеет представления о том, как вы получаете данные в TCP-соединение и из него, и в любом случае одинаковые точные сегменты TCP отправляются по сети.

Если ваш сервер связан с I/O, то WSAAsyncSelect и/или WSAEventSelect работают очень хорошо (и избавят вас от проблемы многопоточности). Только для служб с привязкой к вычислению важны IOCP, поскольку они распределяют рабочие элементы в доступный поток, поэтому одновременные запросы могут разворачиваться и выполнять вычисления на нескольких процессорных ядрах.

WSAPoll - другой вариант.

+0

Я читал о WSAPoll, который кажется эквивалентом Windows epoll(), однако, похоже, он прослушивается, и Microsoft не исправляет его. – Spook

+1

@Spook: Я только что прочитал эту жалобу и да, она не ведет себя точно так же, как Linux 'poll', особенно в отношении неудачных попыток подключения. Тем не менее, контракт «следует, что документация« не »соответствует точному поведению функции с другим именем на другой ОС», и похоже, что она ведет себя как задокументированная. Поэтому вы можете назвать это неудачным дизайнерским решением, но не ошибкой. В любом случае, если это вас беспокоит, используйте любой из трех других подходов, о которых я говорил. –

+0

Хорошо, спасибо за ваш ответ! Я попробовал WSAAsyncSelect с HWND для получения уведомлений в прошлом, и это действительно хорошо работает, я просто думал, что IOCP будет лучшим вариантом. Кроме того, вы говорите, что можно использовать send() и получать с помощью WSARecv()? Мне это кажется маловероятным, но я бы предпочел спросить здесь, прежде чем писать код, который его реализует. – Spook

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

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