альтернативы winsock2 с примером исходного сервера в C ++ - PullRequest
4 голосов
/ 04 января 2009

Я использую этот пример реализации, найденный в http://tangentsoft.net/wskfaq/examples/basics/select-server.html

Это делает большую часть того, что мне нужно, обрабатывает соединения без блокировки и все работает в своем потоке (не создает новый поток для каждого соединения, как это делают некоторые примеры), но я волнуюсь, так как мне сказали winsock будет поддерживать только до 64 клиентских подключений: S

Это 64 соединения верно?

Какие еще есть варианты? Было бы здорово иметь пример c ++ для аналогичной реализации.

Спасибо

Ответы [ 3 ]

6 голосов
/ 04 января 2009

Альтернативная библиотека:

Вам следует рассмотреть возможность использования boost asio . Это кроссплатформенная сетевая библиотека, которая упрощает многие задачи, которые вам, возможно, придется выполнить.

Вы можете найти пример исходного кода , который вы ищете здесь .


О пределе 64:

Нет жесткого ограничения на 64 соединения, которое вы испытаете с хорошим дизайном. В основном, если вы используете какую-то модель потоков, вы не будете испытывать это ограничение.

Вот некоторая информация о лимите, о котором вы слышали:

4.9 - Каковы ограничения "64 розетки"?

Существует два ограничения на 64 гнезда:

Механизм событий Win32 (например, WaitForMultipleObjects ()) может только ждать 64 объекта события одновременно. Winsock 2 обеспечивает WSAEventSelect () функция, которая позволяет вы используете механизм событий Win32 для ждать событий на розетках. Потому что это использует механизм событий Win32, вы можете только ждать событий на 64 сокетов в время. Если вы хотите ждать больше чем 64 объекта события Winsock на время, вам нужно использовать несколько темы, каждый ждет не более 64 розетки.

Функция выбора () также ограничена в определенных ситуациях до ожидания на 64 розетки за раз. FD_SETSIZE константа, определенная в winsock.h определяет размер fd_set структуры, которые вы передаете, чтобы выбрать (). Это по умолчанию установлено 64. Вы можете определить эту константу для более высокого значения прежде чем #include winsock.h, и это заменит значение по умолчанию. К сожалению, по крайней мере один стек Microsoft Winsock и некоторые другие Многоуровневые поставщики услуг предполагают по умолчанию 64; они будут игнорировать розетки за 64-й в большем fd_sets.

Вы можете написать тестовую программу, чтобы попробовать это на системах, которые вы планируете поддержка, чтобы увидеть, если они не ограничено. Если они есть, вы можете получить вокруг этого с потоками, так же, как вы будет с объектами событий.

Источник

2 голосов
/ 04 января 2009

@ Brian:

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

К ОП:

Почему бы вам не использовать winsock2? Вы можете попытаться создать свой собственный сервер с использованием IOCP, хотя сделать эту кроссплатформенность немного сложнее. Вы можете посмотреть на Boost :: asio, как предложил Брайан.

1 голос
/ 05 января 2009

Прежде чем вы решите, что вам нужны «альтернативы winsock2», прочитайте это: Сетевое программирование для Microsoft Windows .

Таким образом, вам НЕ нужна «альтернатива Winsock2», вам нужно понимать, как использовать предоставленные модели программирования для полного воздействия на платформу, на которую вы ориентируетесь. Затем, если вам действительно нужен код кроссплатформенных сокетов, который использует асинхронный ввод / вывод, тогда посмотрите на ASIO, но, если вам действительно не нужен кроссплатформенность Затем в коде рассмотрите что-то, что на самом деле фокусируется на проблемах, которые могут возникнуть у вас на платформе, на которых вы должны сосредоточиться, - то есть на конкретных окнах. Вернитесь к книге, упомянутой выше, и посмотрите на различные варианты, которые у вас есть.

Наиболее производительным и масштабируемым вариантом является использование портов завершения ввода-вывода. У меня есть некоторый бесплатный код, доступный с здесь , который позволяет довольно легко написать сервер, который масштабируется и хорошо работает на платформе на основе Windows (NT); связанная страница также ссылается на некоторые статьи, которые я написал об этом. Сравнение моего фреймворка с ASIO можно найти здесь: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html.

...