私は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);
あります。これでの使用は何ですか?
誰でも教えてください。
私には無害な誤植のように見えます。おそらくコードはdo/whileループであり、誰かが 'do'を' if'に変更しました。 – user3386109
ソースリンクを投稿できますか? – Abhineet
そして、上記のコードを少し短くして、残ったコードを "..."でマークしてください。今のように、コードのほとんどはあなたの特定の質問には関係ありません。 –