#c# #sockets #networking #tcp #tcpclient
Вопрос:
В клиентском приложении я много раз подключаюсь к одному и тому же серверу, чтобы настроить TCP-сокет.
TcpClient client = new TCPClient();
...
await client.ConnectAsync(host, outport);
Похоже, что мои динамические порты исчерпаны, потому что я получаю « Only one usage of each socket address (protocol/network address/port) is normally permitted
«.
Это сообщение немного вводит в заблуждение, но я замечаю, что оно всегда возникает после использования одного и того же количества подключений.
Поэтому я попытался запустить несколько серверов на разных портах. Однако это не имеет значения — первая ошибка возникает после одного и того же количества портов… Теперь я удивлен:
Следует ли учитывать зарезервированный диапазон портов в Windows 10
- в общей сложности или
- на целевой порт, к которому мы подключаемся?
Я думал, что 2) — это ответ, но, основываясь на моих наблюдениях, я больше не уверен.
Комментарии:
1. Fromcmd.exe >Netstat -a. Запуск как на клиенте, так и на сервере. В выводе перечислены все порты TCP/UDP и их статус. Вы не можете использовать порт, который уже используется с тем же IP-адресом источника и назначения.
2. Вы правильно распоряжаетесь, верно?
Ответ №1:
в целом
Существует только 1 пул эфимерных портов, которые совместно используются всеми сокетами.
См. Следующие статьи MSDN для настройки доступного диапазона эфимерных портов:
Устранение неполадок с исчерпанием портов
ОБНОВЛЕНИЕ: Ну, точнее, существует ограниченное количество портов на локальный IP, по крайней мере. Если у вас установлено несколько IP-адаптеров (т. Е. ваш компьютер подключен к нескольким сетям), вы можете привязать несколько сокетов к одному и тому же локальному порту, если они привязаны к разным локальным IP-адресам. Соединение с сокетом однозначно идентифицируется кортежем [Protocol, Local IP, Local Port, Remote IP, Remote Port]
. Таким образом, если вы устанавливаете несколько подключений к одному и тому же удаленному IP/порту с использованием одного и того же протокола (в данном случае TCP), то пары локальных IP/портов должны быть уникальными. Таким образом, если все исходящие сокеты привязаны к одному и тому же локальному IP-адресу, это ограничивает доступные локальные порты, которые вы можете использовать. Но если вы используете несколько сокетов на локальных IP-адресах, это расширит доступные локальные порты. Но это будет работать только в вашем случае использования, если эти несколько сетей имеют маршруты к интересующему вас серверу.
Комментарии:
1. Это означает, что я просто не могу использовать более заданного количества параллельных исходящих портов, независимо от того, подключаюсь ли я к одному или нескольким целевым серверам?
2. @MichaelW это правильно. Для начала вам действительно не следует устанавливать так много одновременных соединений. Зачем вам нужно так много соединений и почему вы не можете повторно использовать соединения? Вы пытаетесь провести какой-то стресс-тест сервера?
3. Это симуляция для стресс-теста.