2016-06-18 6 views
0

Я изучал исходный код ping в C.Каково использование условия if, за которым следует (0)?

В этом я был просмотрен в одной строке. Это условие if, за которым следует while (0).

Меня обыскали в Интернете. Они дают линию, за которой следует (0). Для do, за которым следует while (0), я знаю ответ. Но я не знаю, было ли условие, после которого пока (0).

Образца код,

if (source.sin_addr.s_addr == 0) { 
    socklen_t alen; 
    struct sockaddr_in dst = whereto; 
    int probe_fd = socket(AF_INET, SOCK_DGRAM, 0); 

    if (probe_fd < 0) { 
     perror("socket"); 
     exit(2); 
    } 
    if (device) { 
     struct ifreq ifr; 
     int rc; 

     memset(&ifr, 0, sizeof(ifr)); 
     strncpy(ifr.ifr_name, device, IFNAMSIZ-1); 

     enable_capability_raw(); 
     rc = setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1); 
     disable_capability_raw(); 

     if (rc == -1) { 
      if (IN_MULTICAST(ntohl(dst.sin_addr.s_addr))) { 
       struct ip_mreqn imr; 
       if (ioctl(probe_fd, SIOCGIFINDEX, &ifr) < 0) { 
        fprintf(stderr, "ping: unknown iface %s\n", device); 
        exit(2); 
       } 
       memset(&imr, 0, sizeof(imr)); 
       imr.imr_ifindex = ifr.ifr_ifindex; 
       if (setsockopt(probe_fd, SOL_IP, IP_MULTICAST_IF, &imr, sizeof(imr)) == -1) { 
        perror("ping: IP_MULTICAST_IF"); 
        exit(2); 
       } 
      } else { 
       perror("ping: SO_BINDTODEVICE"); 
       exit(2); 
      } 
     } 
    } 

    if (settos && 
     setsockopt(probe_fd, IPPROTO_IP, IP_TOS, (char *)&settos, sizeof(int)) < 0) 
     perror("Warning: error setting QOS sockopts"); 

    dst.sin_port = htons(1025); 
    if (nroute) 
     dst.sin_addr.s_addr = route[0]; 
    if (connect(probe_fd, (struct sockaddr*)&dst, sizeof(dst)) == -1) { 
     if (errno == EACCES) { 
      if (broadcast_pings == 0) { 
       fprintf(stderr, "Do you want to ping broadcast? Then -b\n"); 
       exit(2); 
      } 
      fprintf(stderr, "WARNING: pinging broadcast address\n"); 
      if (setsockopt(probe_fd, SOL_SOCKET, SO_BROADCAST, 
         &broadcast_pings, sizeof(broadcast_pings)) < 0) { 
       perror ("can't set broadcasting"); 
       exit(2); 
      } 
      if (connect(probe_fd, (struct sockaddr*)&dst, sizeof(dst)) == -1) { 
       perror("connect"); 
       exit(2); 
      } 
     } else { 
      perror("connect"); 
      exit(2); 
     } 
    } 
    alen = sizeof(source); 
    if (getsockname(probe_fd, (struct sockaddr*)&source, &alen) == -1) { 
     perror("getsockname"); 
     exit(2); 
    } 
    source.sin_port = 0; 

#ifndef WITHOUT_IFADDRS 
    if (device) { 
     struct ifaddrs *ifa0, *ifa; 
     int ret; 

     ret = getifaddrs(&ifa0); 
     if (ret) { 
      fprintf(stderr, "gatifaddrs() failed.\n"); 
      exit(2); 
     } 
     for (ifa = ifa0; ifa; ifa = ifa->ifa_next) { 
      if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_INET) 
       continue; 
      if (!strncmp(ifa->ifa_name, device, sizeof(device) - 1) && 
       !memcmp(&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr, 
        &source.sin_addr, sizeof(source.sin_addr))) 
       break; 
     } 
     freeifaddrs(ifa0); 
     if (!ifa) 
      fprintf(stderr, "ping: Warning: source address might be selected on device other than %s.\n", device); 
    } 
#endif 
    close(probe_fd); 
} while (0); 

В этом после того, как если условии, что они с использованием некоторого времени (0). Какая польза в этом.

Может кто-нибудь объяснить мне.

+3

Похож на безобидную опечатку для меня. Возможно, код был циклом do/while, и кто-то изменил 'do' на' if'. – user3386109

+0

Можете ли вы опубликовать ссылку на источник? – Abhineet

+0

И, может быть, немного укоротите приведенный выше код, отметив код «...»? Как и сейчас, большая часть кода не имеет отношения к вашему конкретному вопросу. –

ответ

4

Вы обманываете себя, читая код.

if (condition) { 
    … 
} 

while (0) 
    ; 

Это то, что на самом деле означает код. Цикл while полностью бесполезен (он ничего не делает), и я не могу сказать вам, почему он может быть там.

Чтобы исправить это, пусть ваш код будет автоматически отформатирован.

+0

Это кажется нецелесообразным. – hek2mgl

+0

@ hek2mgl: Хотя в этом ответе не хватает аргументов, его интерпретация кода верна (я просто проверил источник). –

+0

@ IgnacioVazquez-Abrams Я признаю, что я не проверял код, вы говорите, что мой ответ здесь не так? – hek2mgl