ipv6、ipv4のpingの送受信ができる、ipv4ipv6pingexampleと言うソースをダウンロードし実行したのですが、ipv6の受信のみが出来ません。
スニファーソフトで見ると、ping6の応答は帰っているが、受信(WSARecvFrom)でタイムアウトとなる。
確認のため、icmpv6(ping6)の応答を受信する部分のみ作成してテストしても、同様になります。
受信ソケットのbindの引数のaddrinfoに原因があるのではと試しましたがうまくいきません。
アドバイスをお願いいたします。
環境
windowsXP(SP3)、VC++2008
ping先は家のルータ、DOSウィンドウからping6を入力
ipv4は受信できる。スニファーソフトで見ると、ping6の応答は帰っている。
以下は確認用のコード
#include <stdio.h>
#include "winsock2.h"
#include <ws2tcpip.h>
#include "iphdrv2.h"
#pragma comment(lib, "ws2_32.lib")
void main() {
WSADATA wsaData;
SOCKET RecvSocket;
char RecvBuf[1024];
int BufLen = 1024;
SOCKADDR_STORAGE from;
int fromsize = sizeof(from);
struct addrinfo hints, *local=NULL;
int rc;
// for ipv4
//int af = PF_INET, type = SOCK_RAW, proto = IPPROTO_ICMP;
// for ipv6
int af = PF_INET6, type = SOCK_RAW, proto = IPPROTO_ICMPV6;
// Winsock を初期化します。
WSAStartup(MAKEWORD(2,2), &wsaData);
// データ受信用のソケットを作成します。
RecvSocket = socket(af, type, proto);
//struct addrinfo { *
// int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
// int ai_family; /* PF_xxx */
// int ai_socktype; /* SOCK_xxx */
// int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
// size_t ai_addrlen; /* length of ai_addr */
// char *ai_canonname; /* canonical name for nodename */
// struct sockaddr *ai_addr; /* binary address */
// struct addrinfo *ai_next; /* next structure in linked list */
// };
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = af;
hints.ai_socktype = type;
hints.ai_protocol = proto;
//rc = getaddrinfo(addr, port, &hints, &res);
rc = getaddrinfo(NULL, "0", &hints, &local);
if (rc != 0) {
printf("getaddrinfo() failed with error code %d\n", rc);
printf("Unable to obtain the bind address! with error code %d\n", WSAGetLastError());
getchar();
return ;
}
//bind
rc = bind(RecvSocket, local->ai_addr, local->ai_addrlen);
if (rc == SOCKET_ERROR) {
fprintf(stderr, "bind() failed with error code %d\n", WSAGetLastError());
getchar();
return ;
}
// データを受信します。
printf("データの受信中……\n");
rc =recvfrom(RecvSocket,RecvBuf,BufLen,0,(SOCKADDR *)&from,&fromsize);
//rc =recv(RecvSocket,RecvBuf,BufLen,0);
if(rc == -1){
printf("Recv failed with error code %d\n", WSAGetLastError());
}
else {
printf("受信が完了しました。%d Byte\n",rc);
}
closesocket(RecvSocket);
printf("終了します。\n");
freeaddrinfo(local);
WSACleanup();
return;
}
No.2ベストアンサー
- 回答日時:
recvfromが判りませんが、通信が確立しているのでしょうか。
その当りの細かい点が判りませんので何とも言えないのですが。
ipv4ipv6pingexampleを参考にされたとのことですが、下記のサーバー用(複数通信)のサンプルも参考にされたらいかがでしょうか。
http://members.jcom.home.ne.jp/toya.hiroshi/wins …
この回答への補足
samtomsan ありがとうございます。
recvfromは、参考にしたコードがこれだったので、同じにしました。
送信元のipアドレスが分かります。ipv4のpingでは、家のルータのアドレスがセットされていました。
ping6では、ipv6のアドレスが入るはずですが、受信待ちで止まってしまうので、、、
recv関数でも試しましたが、ping6では、受信待ちで止まってしまいます。
通信が確立しているか?について
icmpはコネクションレスのやりとりなので、通信は確立していません。
紹介して頂いた、サンプルコードは、winsock2のipv6のtcpとudpの送受信コードのサンプルと思います。
今回は、ipv6のicmpの受信が出来ないので、チョット違うように思います。
winsock2のrawsocketを利用して、icmpv6パケットをキャプチャする方法と言う視点で、
もう一度、調べなおして見たいと思います。
色々と、アドバイスを頂き有難うございました。
この質問は、一旦、締め切りとさせて頂きます。
ありがとうごじました。
No.1
- 回答日時:
つまらぬ質問ですが、XPはIPv6のプロトコルは自分でインストールする必要がありますが、インストールされているでしょうか。
Windows XP IPv6 プロトコルに関する FAQ
http://technet.microsoft.com/ja-jp/library/cc835 …
あなたのマシンでIPv6を体験
http://www.atmarkit.co.jp/fnetwork/tanpatsu/10wi …
IPv6ネットワークを作ろう
http://www.hieda.net/pcnwbt/ipv6/
この回答への補足
IPv6のプロトコルはインストールしています。
DOSウィンドウでping6をすると、echoの返信が帰ってきます。
念のため、ipv6 installを実行後、確認をしましたが、現象は同じです。
下記は、DOSウィンドウでping6の結果です。
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\xxxxx>ping6 240f:0010:4ca3:0001:21b:8bff:fe79:4f5e
Pinging 240f:10:4ca3:1:21b:8bff:fe79:4f5e
from 240f:10:4ca3:1:c8f6:d85b:d092:3516 with 32 bytes of data:
Reply from 240f:10:4ca3:1:21b:8bff:fe79:4f5e: bytes=32 time<1ms
Reply from 240f:10:4ca3:1:21b:8bff:fe79:4f5e: bytes=32 time<1ms
Reply from 240f:10:4ca3:1:21b:8bff:fe79:4f5e: bytes=32 time<1ms
Reply from 240f:10:4ca3:1:21b:8bff:fe79:4f5e: bytes=32 time<1ms
Ping statistics for 240f:10:4ca3:1:21b:8bff:fe79:4f5e:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語
-
bashスクリプト内のpostgreSQL...
-
FTXって、どういう意味ですか?...
-
勉強(特に数学)をする際、問...
-
YAHOO JAPANの左右の広告を非表...
-
鯉はどうして水面に跳ねるので...
-
pHジャンプについて教えてくだ...
-
慣性がなかったら、どうなりますか
-
ヤフー知恵袋、出禁になりました。
-
下記のフランス語の英訳は文法...
-
よく「飲み行こう」「食べ行こ...
-
動いている電車の中で真上にジ...
-
dynamicsとkineticsの違いって...
-
フランス語 添削 目上の方なの...
-
検察エンジンで検索されるホー...
-
ワークポイントとは何ですか(...
-
ロボットの操作について
-
皆さんが想像する2050年はどん...
-
質問失礼いたします 英語の得意...
-
走る電車の中と外でジャンプし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashスクリプト内のpostgreSQL...
-
YAHOO JAPANの左右の広告を非表...
-
ディープフェイクを作成するサ...
-
pdfをaiに自動で変換したい
-
得もないのに面倒なことをしよ...
-
FTXって、どういう意味ですか?...
-
小論文?作文?です。お願いし...
-
失業者が出るのになぜAIを作る...
-
鯉はどうして水面に跳ねるので...
-
pHジャンプについて教えてくだ...
-
アルファベットを中国語(漢字...
-
dynamicsとkineticsの違いって...
-
ビー玉を41個使って遊ぶゲー...
-
都市銀行店頭の店員さん全てロ...
-
慣性がなかったら、どうなりますか
-
よく「飲み行こう」「食べ行こ...
-
生物と無生物の最大の違いって...
-
走る電車の中と外でジャンプし...
-
steamに登録できない
-
皆さん、おはようございます♪ ...
おすすめ情報