bind () - выводит UDP-сокеты на разные адреса - PullRequest
1 голос
/ 19 февраля 2012

У меня очень простой вопрос, на который я не могу найти ответ нигде:

Можно ли с помощью сокетов Linux C связывать () и затем recvfrom () UDP-пакеты с IP-адресом, отличным от локального?

Т.е., если хосту был присвоен сетевой адрес 10.0.0.4, и я хочу, чтобы он мог принимать UDP-пакеты, отправленные на адрес 10.0.0.5 через порт 5505 (например), как этого достичь?

Я просто не могу найти никаких примеров такого использования bind / recvfrom, что, похоже, должно быть довольно распространенным явлением.

Обновление

Я пытаюсь передать потоки пакетов между несколькими хостами. Каждый хост передает потоки UDP-пакетов по своему собственному адресу, и любой из других хостов может прослушивать с помощью recvfrom () по определенному адресу.

1 Ответ

2 голосов
/ 20 февраля 2012

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

Вы можете добиться желаемого эффекта с помощью IP Multicast. Вы должны выбрать конкретный адрес многоадресной рассылки для своего приложения и привязаться к нему, а затем использовать опцию сокета IP_ADD_MEMBERSHIP, чтобы присоединиться к группе многоадресной рассылки. Затем вы можете использовать recvfrom() обычным способом.

...