Правильная команда для отправки в датаграмму в интернет-домене для порта 0 - PullRequest
0 голосов
/ 14 октября 2011

Я следую примеру, приведенному в Вводное учебное пособие по межпроцессному взаимодействию 4.4BSD , где рассказывается, как общаться с помощью дейтаграмм в домене Интернета.В примерах 6a и 6b, 6a устанавливаются порт и имя хоста

name.sin_addr.s_addr = INADDR_ANY;
name.sin_port = 0;

Из того, что я понимаю, INADDR_ANY - это подстановочное значение, позволяющее сокету получать из любого места.Но я не могу отправить откуда-либо и явно установить имя хоста в 6b

hp = gethostbyname(argv[1]);

Так какое имя хоста будет здесь допустимым?Когда я попробовал

program6b localhost 0

Но это говорит о том, что он не может назначить запрошенный адрес (я использовал другие адреса и то же сообщение).6a говорит, что «Socket имеет порт № 0», хотя это означает, что он прослушивает все порты, верно?В любом случае я попытался настроить пост вручную, чтобы "Socket имел порт # 53790".Netstat показывает, что он слушает

udp4 0 0 * .53790 .

И с помощью команды

program6b localhost 53790

Iполучить ответ, что данные были получены из сокета, который читает.Итак, я частично понимаю, что происходит, но я хотел бы знать, как пример должен работать для порта № 0.

1 Ответ

1 голос
/ 14 октября 2011

Порт 0, как UDP, так и TCP не могут нормально использоваться.Они указаны в сокетах API bind, чтобы запросить у операционной системы произвольный свободный порт для приложения.Обычно это делается с помощью клиентского кода, который не заботится о конкретном используемом порту.Код сервера, с другой стороны, обычно указывает известный порт.

О INADDR_ANY, при выполнении локального bind это означает:

  • Прослушивание во всей сетиинтерфейсы, если сокет прослушивает.
  • Пусть ОС выберет соответствующий сетевой интерфейс для отправки данных.

Если вместо этого вы указываете адрес, это должен быть адрес вашей машины.и относится к сетевому интерфейсу, которому принадлежит этот адрес.Затем:

  • Если сокет прослушивает: он будет прослушивать только через этот сетевой интерфейс.
  • Если сокет отправляет данные, он будет рассматривать только этот сетевой интерфейс.

Как примечание: вы не можете прослушивать каждый порт одновременно, если не используете какой-то необработанный сокет.Но не с UDP или TCP.

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