2013-11-20 8 views
2

Я в настоящее время в состоянии слушать простой вещательный сервер я написал (который просто передает «привет») просто делать это:Как прослушивать трансляцию по определенному интерфейсу в c linux?

int fd = socket(PF_INET, SOCK_DGRAM, 0); 
struct sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 
add.sin_family = AF_INET; 
add.sin_port = htons(10074); 
bind(fd, struct sockaddr*) &addr, sizeof(addr)); 

char buf[800]; 
recvfrom(fd, buf, sizeof(buf), 0, NULL, 0); 

Что интересно, хотя есть, какой интерфейс будет выше использовать? Какой-то дефолт? И как мне изменить интерфейс, на котором я слушаю трансляцию? Я видел это в многоадресной рассылке, установив imr_address и imr_ifindex в структуру ip_mreqn, но я не уверен, есть ли эквивалент для трансляции.

ответ

2

Если вы хотите изменить порт, который вы слушать на вас просто выбрать конкретный адрес в вашем sin_addr (вы в настоящее время оставляя 0 из memset, а не явно назначая INADDR_ANY). Адрес должен быть одним из ваших IP-адресов, и интерфейс будет автоматически выбран из этого.

2

Если вы хотите слушать на определенном интерфейсе идентифицированного по имени интерфейса, вы можете использовать getifaddrs для отображения имени интерфейса к набору адресов сокетов, а затем связать сокеты к каждому такому адресу. (В общем случае может потребоваться связывать более одного сокета на адрес, а интерфейсы могут иметь много адресов.)

Как правило, лучше настроить прослушиватели на адрес, и пусть ядро ​​беспокоится о том, какой адрес соответствует какой интерфейс. Этот способ согласуется с другими службами на базе IP, и к ним используются системные администраторы.