значения по умолчанию для IP_MULTICAST_IF - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь выяснить, какие значения по умолчанию используются для опции IP_MULTICAST_IF после настройки нового сокета. К сожалению, мой код segfaults, и я на самом деле не знаю, почему ?! Я что-то не так делаю, или как получить значения по умолчанию для опции IP_MULTICAST_IF?

  int sock;
  struct in_addr interface_addr;
  int addr_size;

  if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    perror("socket() failed");
  }

  addr_size = sizeof(interface_addr);

  if ((getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, &addr_size)) <  0) {
    perror("getsockopt() failed");
  }

  printf("The default interface is %s\n", inet_ntoa(interface_addr));

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Я виноват, в моем коде не было включения. С

#include <arpa/inet.h>

отлично работает.

0 голосов
/ 26 марта 2012

Прочтите справочную страницу ip(7) для вашей платформы.IP_MULTICAST_IF не дает struct in_addr.

В Linux:

IP_MULTICAST_IF (since Linux 1.2)
        Set the local device for a multicast socket.  Argument is an  ip_mreqn  or
        ip_mreq  structure similar to IP_ADD_MEMBERSHIP.
        When an invalid socket option is passed, ENOPROTOOPT is returned.

IP_ADD_MEMBERSHIP (since Linux 1.2)
          Join a multicast group.  Argument is an ip_mreqn structure.

             struct ip_mreqn {
                  struct in_addr imr_multiaddr; /* IP multicast group
                                                   address */
                  struct in_addr imr_address;   /* IP address of local
                                                   interface */
                  int            imr_ifindex;   /* interface index */
              };
          imr_multiaddr  contains  the  address  of the multicast group the application wants to join or
          leave.  It must be a valid multicast address (or setsockopt(2) fails with the  error  EINVAL).
          imr_address is the address of the local interface with which the system should join the multi‐
          cast group; if it is equal to INADDR_ANY an appropriate interface is  chosen  by  the  system.
          imr_ifindex  is  the interface index of the interface that should join/leave the imr_multiaddr
          group, or 0 to indicate any interface.
          The ip_mreqn structure is available only since Linux 2.2.  For compatibility, the old  ip_mreq
          structure  (present  since Linux 1.2) is still supported; it differs from ip_mreqn only by not
          including the imr_ifindex field.  Only valid as a setsockopt(2).
...