Порт, используемый клиентом TCP для подключения к серверу, недоступен для других серверов TCP - PullRequest
7 голосов
/ 25 марта 2011

При создании TCP-клиента с использованием API-интерфейса сокета на локальном хосте используется порт для подключения к TCP-серверу.

Используемый порт, по-видимому, недоступен для другого приложения, являющегося TCP-сервером.связываться с сервером и действовать как сервер.

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

Правда ли, чтоTCP-клиент будет динамически выбирать порт для использования и не позволять другим программам быть сервером на этом порту?

Может ли клиент контролировать, какой порт он использует, чтобы убедиться, что он не занимает порт, требуемый другой программой?

Ответы [ 3 ]

8 голосов
/ 25 марта 2011

Правда ли, что TCP-клиент будет динамически выбирать порт для использования и не позволять другим программам быть сервером на этом порту?

Да, это так.

Может ли клиент контролировать, какой порт он использует, чтобы убедиться, что он не занимает порт, необходимый для другой программы?

Да, вы можете, но не должны.Используйте свойство Bind.

ОК .. вот что:

Когда вы устанавливаете соединение с сервером, вы открываете порт сокета, который больше 1024. Дело в том, что этобудет большим номером порта.

Ваш сервер не должен открывать порт TCP больше 1024. По сути, вы должны поддерживать работу сервера на низком порте.Это то, о чем нам говорят все документы http.

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

2 голосов
/ 25 марта 2011

Да, порт будет выбран из предопределенного диапазона, который варьируется от ОС к ОС, и заблокирован для другого использования. Вы можете выбрать определенный порт с помощью bind, если вам это нужно.

EDIT:

Единственный случай, когда вы можете иметь несколько сокетов TCP, привязанных к одному и тому же локальному порту / IP, - это когда вы accept() новые сокеты из прослушивающего сокета. Вы никогда не сможете bind() подключить TCP-сокет к используемому порту / IP. В SO_REUSEADDR также есть некоторая путаница, эта опция сокета не разрешает повторное использование порта, она просто ослабляет правила, когда есть только мертвые тайм-ауты соединений, привязанных к нужному порту.

0 голосов
/ 25 марта 2011

Если одна программа прослушивает , привязанную к порту, я не верю, что другая тоже может.Как правило, нижние порты зарезервированы для определенных служб, таких как HTTP на порте 80. Если вы хотите случайный порт, вы должны сгенерировать один выше 1024. Список часто используемых портов смотрите здесь: http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

edit: исправлено из комментария ниже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...