"C++ Windows" миллион исходящих TCP-соединений как обойти ограничени 65535 ?
Tоесть: 1 клиент отправляет кучу TCP-соединений. Создаются потоки и одновременя подключаются к чему бо либо 200.000 соединений..
В комментариях товарищи сказали немного неправильно... современные приложения не меняют ни порт ни айпи, а создают множество сокетов которые как раз распределяются один сокет на клиента. udp или tcp или какого то другого протокола - не важно. и так вы можете обрабатывать сообщения с одного айпи и порта. Это если у приложеия реально несколько миллионов пользователей до да тогда они распределяются по серверам.
Протокол TCP передает IP-пакеты по сети. Сами пакеты не знают, к какому протоколу/клиенту/адресу/порту они принадлежат и какие данные передают. Это просто пачка байтов.
TCP-пакет завернут в IP-пакет (прочитайте на википедии или посмотрите в Wireshark). В IP-Заголовке есть адреса IP источника и приемника, в TCP-заголовке есть порты источника и приемника. Порт - это просто число из двух байтов (численно 0..65535). Благодаря порту приложения в ОС могут получать свой поток пакетов независимо от других приложений.
Пример: Есть хост, у него есть SSH и Telnet сервера. Оба слушают все адреса этого хоста, НО SSH-сервер слушает TCP-порт 22, а Telnet слушает TCP-порт 23. На сетевую карту хоста приходит пакет TCP с Destination Port == 23. ОС посмотрит на этот пакет и положит его в сокет Telnet-сервера. SSH не увидит этот пакет вообще.
Отсюда следуют следующее самое очевидное протокольное ограничение:
Входящих соединение на один IP-адрес и один TCP-порт может быть не более 65535 штук, это ограничение протокола TCP
Вариант 1. Брать несколько IP-адресов и слушать (listen) каждый. То есть если взять и назначить хосту 2 IP адреса, и в сервере слушать не *:23
например, а <ip>:23
, то есть только один адрес - мы не нарушаем правило и имеем те же 65535, но для двух IP-адресов. Ограничение повысится до 65535*2. Данный способ довольно идиотский, поскольку обычно клиент подключается к одному адресу или доменному имени, вы предлагаете иметь 16 разных адресов. Куда подключаться клиенту - не понятно, нужно придумывать что-то еще - запрос канала у сервера и т.п.
Вариант 2. Задействовать несколько портов. Так делают иногда, один порт считается основным, второй порт резервным, и так далее. То есть ваш сервер должен слушать не только *:10500
, а еще *:10501
, и возможно *:10502
и так далее. Тогда получится, что входящих соединение на каждый порт может быть 65535, для миллиона нужно всего 16 портов открыть. Клиент может подключаться по порядку - к одному порту, потом к следующему, потом к следующему и так, пока не доедет до последнего в заранее известном пуле. Аналогично можно сделать выделенный порт на запрос канала для клиента - "Сервер, скажи мне порт, куда подключиться и где свободно сейчас"
Вариант 3. Посмотреть внимательнее задачу, которую нужно выполнить. Возможно у вас не хватает знание или понимания, чтобы выбрать правильный путь и инструмент, и вы пытаетесь забить гвоздь микроскопом, потому что не знаете про существование молотка
Виртуальный выделенный сервер (VDS) становится отличным выбором
C++ как подключить к программе несколько ipЧто бы расширить локальные порты 2*65535
Использую spring и selenium в одном проекте, и приходится оборачивать WebDriver вот таким некрасивым способом:
Захотел в проекте android studio создать контекстное меню, написал следующее в классе MainActivity(Именно для этого активити нужно меню):