有識者の方、ご教示ください。Win10 64bit/cygwin64(gcc 7.4.0)環境で、C言語によるUDPポートチェックを試みています。UDPソケットでsendto()を要求した後、タイムアウト付きのselect()でICMPソケットのreadfdsを監視しています。目的のUDPポートは閉じているため、Wiresharkでは期待どおり"port unreachable"の受信を確認しています。しかし、readfdsがreadyにならずにselect()ではタイムアウトが生じ、UDPポートは空いていると判断してしまいます。どうもICMP受信をアプリケーションに返却してない(?)ようです。何か情報をお持ちではないでしょうか?以下コードの抜粋。
send = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
recv = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
dst_addr.sin_addr.s_addr = inet_addr("192.168.1.100");
dst_addr.sin_port = htons(12345);
sendto(send, NULL, 0, 0, (struct sockaddr *)(&dst_addr), sizeof(dst_addr));
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(recv, &readfds);
if(0 > select(recv+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv))
{
fprintf(stderr, "select() error.??/n");
} else {
if(FD_ISSET(recv, &readfds))
{
recvfrom(recv, buf, MAXBUF, 0, NULL, NULL);
ip = (struct ip *)buf;
ihlen = ip->ip_hl << 2;
icmp = (struct icmp *) ((char *)ip + ihlen);
if ((ip->ip_src.s_addr == dst_addr.sin_addr.s_addr)
&& (icmp->icmp_type == ICMP_UNREACH)
&& (icmp->icmp_code == ICMP_UNREACH_PORT)
{
fprintf(stdout, "NOT open.??/n");
} else {
fprintf(stdout, "Unexpected ICMP response.??/n");
}
} else {
fprintf(stdout, "May be open (due to a timeout).??/n");
}
}
探検
ネットワークプログラミング相談室 Port30 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
756デフォルトの名無しさん
2021/02/05(金) 15:37:55.74ID:Wzlgg/bF■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★2 [BFU★]
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★3 [BFU★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★4 [Hitzeschleier★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 [Hitzeschleier★]
- ホリエモン、「持ち家=幸せという価値観は過去のもの」と断言「快適な住まいが欲しいなら、賃貸住宅を次々に替えていく」 [muffin★]
- 【実況】博衣こよりのえちえちスーパーダンガンロンパ2🧪
- 中国軍「小泉防衛大臣おもろw」 [834922174]
- 今さっき西谷駅でゲロ吐いてしれっと逃げたやつ
- 【新番組】轟はじめ🐧⚡のぶんぶんぶーん🚗💨!【🏡】
- 自民党のヒゲ「日本側の無線でcopyとは言ったが了解という意味ではない」 [834922174]
- もちもち食感って言葉があるけど、私も餅ってもちもちしてないよな
