Unix-сокеты: когда использовать функцию bind ()? - PullRequest
10 голосов
/ 04 марта 2011

У меня нет четкого представления о том, когда мне нужно использовать функцию bind ().Я предполагаю, что это должно использоваться всякий раз, когда мне нужно получить данные (т.е. функции recv () или recvfrom ()), использую ли я TCP или UDP, но кто-то сказал мне, что это не так.

Может кто-нибудьуточнить немного?

РЕДАКТИРОВАТЬ Я прочитал ответы, но на самом деле я не так ясно.Давайте рассмотрим пример, где у меня есть UDP-клиент, который отправляет данные на сервер, а затем должен получить ответ.Я должен использовать привязку здесь, верно?

Ответы [ 5 ]

18 голосов
/ 04 марта 2011

Этот ответ немного скучный, но я думаю, что он поможет.

Когда мы работаем с компьютерными сетями, мы действительно просто осуществляем межпроцессное взаимодействие.Допустим, на вашем компьютере было две программы, которые хотели общаться друг с другом.Вы можете использовать pipe для отправки данных из одной программы в другую.Когда вы говорите ls | grep pdf, вы берете вывод ls и подаете его в grep.Таким образом, вы получаете однонаправленную связь между двумя отдельными программами ls и grep.

Когда вы делаете это, кто-то должен отслеживать идентификатор процесса (PID) каждого процесса.Этот PID является уникальным идентификатором для каждого процесса, и он помогает нам отслеживать, кто является процессами «источника» и «места назначения» для данных, которые мы хотим передать.

Итак, теперь давайте представим, что у вас есть данные с веб-сервера, чемВы хотите перенести в браузер.Ну, это тот же сценарий, что и выше - межпроцессное взаимодействие между двумя программами, «сервером» и «браузером».

За исключением этого времени эти две программы находятся на разных компьютерах.Механизм межпроцессного взаимодействия между двумя компьютерами называется «сокеты».

Так здорово.Вы берете некоторые данные, перетягиваете их по проводам, а другой компьютер получает их.За исключением того, что компьютер не знает, что делать с этими данными.Помните, мы сказали, что нам нужен PID, чтобы знать, какие процессы взаимодействуют?То же самое верно в сети.Когда ваш компьютер получает данные HTML, как он узнает, что отправляет их «firefox», а не «pidgin»?

Хорошо, когда вы передаете сетевые данные, вы указываете, что они отправляются на определенный «порт».Порт 80 обычно используется для Интернета, порт 25 для Telnet, порт 443 для HTTPS и т. Д.

И этот «порт» привязан к определенному идентификатору процесса на машине.Вот почему у нас есть порты.Вот почему мы используем bind().Чтобы сообщить отправителю, какой процесс должен получить наши данные.

Это должно объяснить ответы людей.Если вы отправитель, вам все равно, что является исходящим портом, поэтому обычно вы не используете bind() для указания этого порта.Если вы являетесь получателем, все остальные должны знать, где вас искать.Таким образом, вы bind() делаете свою программу на порт 80, а затем говорите всем, чтобы они обязательно передавали туда данные.

Чтобы ответить на ваш вопрос, да, вы, вероятно, хотите использовать bind () для своего сервера.Но клиентам не нужно использовать bind () - им просто нужно убедиться, что они передают данные на любой порт, который вы выбрали.

13 голосов
/ 04 марта 2011

После прочтения вашего обновленного вопроса. Я бы предложил не использовать функцию bind() при совершении клиентских звонков. Эта функция используется при написании вашего собственного сервера для привязки сокета (созданного после вызова socket()) к физическому адресу.

Для получения дополнительной помощи посмотрите этот учебник

Client Server Model

1 голос
/ 04 марта 2011

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

1 голос
/ 04 марта 2011

bind() полезно, когда вы пишете сервер, который ожидает данные от клиентов, «прослушивая» известный порт. С bind() вы можете установить порт, на котором вы будете listen() с тем же сокетом.

Если вы пишете клиенту, вам не нужно звонить bind() - вы можете просто позвонить recv(), чтобы получить данные, отправленные с сервера. Ваш локальный порт будет иметь «эфемерное» значение, когда будет установлено соединение TCP.

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

вам нужно вызывать bind () только на вашем сервере. Это особенно необходимо для привязки порта к вашему сокету.

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