Датаграмма с "неправильного" IP - PullRequest
1 голос
/ 07 сентября 2010

У меня есть Linux с виртуальным IP-адресом.Вот часть вывода из ip addr:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether e4:1f:13:60:10:34 brd ff:ff:ff:ff:ff:ff
    inet 212.179.158.220/25 brd 212.179.158.255 scope global eth0
    inet 212.179.158.221/32 scope global eth0
    inet6 fe80::e61f:13ff:fe60:1034/64 scope link
       valid_lft forever preferred_lft forever

На этом компьютере я создаю DatagramSocket, привязанный к new InetSocketAddress(port), который должен привязываться к подстановочному IP.

Приложение тогдаполучает сообщения, отправленные на 212.179.158.220 или 212.179.158.221 , но когда он отвечает, ответ всегда воспринимается как 212.179.158.220 , тогда как I 'Мне нравится, что удаленный адрес ответа отражает IP-адрес, который получил исходное сообщение.

Я могу создать сокет для каждого IP-адреса и прослушивать оба;это дает мне поведение, которое я хочу, но это означает, что если виртуальный IP-адрес появляется во время работы приложения, он будет игнорировать сообщения, отправленные VIP.

Итак, теперь, когда я изложил это:Есть ли способ сделать так, чтобы удаленный хост ответного сообщения совпадал с тем, на котором пришло исходное сообщение?Я не ожидал бы, что это будет автоматически, так как откуда сокет узнает, чтобы связать этот ответ с этим сообщением?Но, возможно, есть способ заставить его?

Заранее спасибо.

Майкл

1 Ответ

0 голосов
/ 07 сентября 2010

Если установить параметр сокета IP_PKTINFO, а затем использовать recvmsg() для получения дейтаграммы и предоставить буфер msg_control, управляющее сообщение IP_PKTINFO будет включено в полученные дейтаграммы, которые содержат структуру struct in_pktinfo :

struct in_pktinfo {
    unsigned int   ipi_ifindex;  /* Interface index */
    struct in_addr ipi_spec_dst; /* Local address */
    struct in_addr ipi_addr;     /* Header Destination address */
};

В этом контрольном сообщении указывается локальный адрес назначения. Затем вы можете передать то же управляющее сообщение с ответом, используя sendmsg(), и исходный адрес получателя будет использоваться в качестве источника.

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