альтернативы winsock2 с примером исходного кода сервера на С++

StackOverflow https://stackoverflow.com/questions/411295

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Спасибо

Это было полезно?

Решение

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

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

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


О лимите 64:

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

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

4.9. Каковы ограничения для «64 сокетов»?

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

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

Функция select () также ограничена в определенных ситуациях, ожидающим 64 гнезда за раз.FD_SetSize Constant, определенная в winsock.h определяет размер структур FD_SET, которые вы проходите на Select ().Это определено по умолчанию до 64.Вы можете определить эту константу до более высокого значения, прежде чем вы #include winsock.h, и это переоценит значение по умолчанию.К сожалению, по крайней мере один не-микрософт-стек Winsock и некоторые многослойные поставщики услуг предполагают дефолт 64;Они будут игнорировать гнезда за пределы 64 -го в более крупных fd_sets.

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

Источник

Другие советы

@Брайан:

                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, как предложил Брайан.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top