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

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

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

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

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

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

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

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

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

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

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