2016-06-18 9 views
0

私はC言語でpingソースコードを学習していました。if条件の後にwhile(0)を使用するとは何ですか?

これは私が1行見たものです。これはif条件の後に(0)が続く。

インターネットで検索しました。彼らはラインを与える後に続く(0)だけに続きます。 while(0)のあとに続いて、私は答えを知っています。しかし、私は条件がの後に(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); 

あります。これでの使用は何ですか?

誰でも教えてください。

+3

私には無害な誤植のように見えます。おそらくコードはdo/whileループであり、誰かが 'do'を' if'に変更しました。 – user3386109

+0

ソースリンクを投稿できますか? – Abhineet

+0

そして、上記のコードを少し短くして、残ったコードを "..."でマークしてください。今のように、コードのほとんどはあなたの特定の質問には関係ありません。 –

答えて

4

あなたはコードを読んでいる間に自分を騙しました。

if (condition) { 
    … 
} 

while (0) 
    ; 

これは実際のコードの意味です。 whileループは完全に役に立たず(何もしません)、なぜそこにいるのかはわかりません。

これを一般的に修正するには、コードを自動的にフォーマットします。

+0

それは妥当ではないようです。 – hek2mgl

+0

@ hek2mgl:この答えは推論が不足していますが、コードの解釈は正しい(私はソースをチェックしたばかりです)。 –

+0

@ IgnacioVazquez-Abrams私はコードをチェックしていないことを認めますが、あなたは私の答えが間違っていると言いますか? – hek2mgl

関連する問題