アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (2件)

つまらぬ質問ですが、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

補足日時:2011/08/08 14:44
    • good
    • 0

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パケットをキャプチャする方法と言う視点で、
もう一度、調べなおして見たいと思います。
色々と、アドバイスを頂き有難うございました。
この質問は、一旦、締め切りとさせて頂きます。
ありがとうごじました。

補足日時:2011/08/09 21:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!