В каких ситуациях на стороне клиента требуется bind()?

Я изучаю программирование сокетов. Когда вы будете использовать bind() на стороне клиента? Какие типы программ ему понадобятся и почему? Где я могу найти пример?

Ответ 1

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

Ответ 2

Примером может служить подключение к данным активного FTP-соединения. В этом случае сервер подключается из своего порта 20 к IP и порту, указанному командой PORT или EPRT.

Ответ 3

Классическим примером клиентской программы, использующей bind(), является (устаревшее) семейство сетевых клиентов rlogin/rsh. Эти клиенты должны были использоваться в сетях с сильными доверительными отношениями - в некоторых случаях серверный сервер доверяет клиентской машине, чтобы сообщить ему имя пользователя подключаемого пользователя. Это потребовало, чтобы клиентская программа подключалась с низкого порта (порт меньше 1024), поскольку такие порты ограничены пользователем root и, следовательно, (теоретически) доказывают, что используемый клиент авторизован системным администратором.

Протокол NFS имеет аналогичные доверительные отношения, и аналогичным образом клиент делает соединения с низким номером порта, используя bind().

Другим примером являются IRC-клиенты, которые позволяют пользователю указывать конкретный IP-адрес источника для подключения. Это предназначено для размещения пользователей со многими IP-адресами, назначенными на их машине, каждый из которых имеет другое имя домена "тщеславие", назначенное ему. Выбор того, с каким IP-адресом подключиться (с помощью bind()), позволяет пользователю выбрать, какое имя домена будет отображаться как на IRC.

Ответ 4

Я предполагаю, что вы должны связать() в случае сокетов UDP.

Ответ 5

Хорошая ситуация была бы в случае p2p, вы сообщаетесь с STUN-сервером со связанным сокетом, а STUN-сервер сообщает вам порт, по которому он получает сообщения из вашего сокета (который может отличаться от того, который вы если вы связали свой сокет в зависимости от вашей сети и, более конкретно, от вашего типа NAT). Это позволит вам быть в курсе реального перевода порта, который делает ваш NAT, и вы сможете предоставить эту информацию потенциальным коллегам, которые хотят подключиться к вам. Связывание сокета полезно, поскольку некоторые NAT динамически предоставляют вам порты (привязка к порту x дважды может не дать вам тот же "реальный" порт). Таким образом, вы сможете напрямую использовать сокет, который вы должны прослушивать на порту.

Ответ 6

Функция

привязка является одной из "ключевых" функций. Он связывает ваш сокет (сервер или клиент) с адресом (ip + port). Что касается Windows, вы должны использовать bind для WinSockets. Есть хорошая книга об этом "Сетевое программирование для Microsoft Windows" Энтони Джонса и Джима Олунда.

Ответ 7

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