IPv6(UDP)の通信
/*
ws2_32.lib を「追加の依存ファイル」に指定しておく
ws2_32.lib のバージョンや依存関係によってはinet_ptonが使えないので「VC++ディレクトリ」を確認する
*/
#include <winsock2.h> /* windows sockets */
#include <ws2tcpip.h> /* contain ws2ipdef.h */
#include <stdio.h> /* printf */
int main() {
struct sockaddr_in6 tSockAddr = {0}; // 構造体は初期化しておかないとエラーになる
char auPkt[] = "Hello IPv6 World!!";
int auPktLen = strlen(auPkt);
// WinSock初期化
WORD wVersionRequested = MAKEWORD(2, 2); // 使用するWinSockのバージョン要求
WSADATA wsaData; // WinScokデータ構造体
int nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (nErrorStatus != 0) {
printf("初期化失敗です\n");
return -1;
}
/* ソケット生成 */
int iSocket = (int)socket(AF_INET6, (int)SOCK_DGRAM, IPPROTO_UDP);
if (iSocket == -1) {
printf("socket error\n");
return -1;
}
/* sockaddr_in6 構造体の設定 */
tSockAddr.sin6_family = AF_INET6;
tSockAddr.sin6_port = htons(5001);
// 『送り先のIP』を tSockAddr.sin6_addr に格納
// 古いws2_32.libには存在しない事もあるので注意
#if 1
inet_pton(AF_INET6, "FE80::6212:8BFF:FEA1:ED21", &(tSockAddr.sin6_addr));
#else
tSockAddr.sin6_addr.u.Byte[0] = 0xFE;
tSockAddr.sin6_addr.u.Byte[1] = 0x80;
tSockAddr.sin6_addr.u.Byte[2] = 0x00;
tSockAddr.sin6_addr.u.Byte[3] = 0x00;
tSockAddr.sin6_addr.u.Byte[4] = 0x00;
tSockAddr.sin6_addr.u.Byte[5] = 0x00;
tSockAddr.sin6_addr.u.Byte[6] = 0x00;
tSockAddr.sin6_addr.u.Byte[7] = 0x00;
tSockAddr.sin6_addr.u.Byte[8] = 0x62;
tSockAddr.sin6_addr.u.Byte[9] = 0x12;
tSockAddr.sin6_addr.u.Byte[10]= 0x8B;
tSockAddr.sin6_addr.u.Byte[11]= 0xFF;
tSockAddr.sin6_addr.u.Byte[12]= 0xFE;
tSockAddr.sin6_addr.u.Byte[13]= 0xA1;
tSockAddr.sin6_addr.u.Byte[14]= 0xED;
tSockAddr.sin6_addr.u.Byte[15]= 0x21;
#endif
int iRet = sendto(iSocket, (const void *)auPkt, auPktLen, 0,
(struct sockaddr*)&tSockAddr, sizeof(tSockAddr));
if (iRet < 0)
{
printf("error=%d\n", WSAGetLastError());
}
closesocket(iSocket);
WSACleanup();
return iRet;
}
/*
ws2_32.lib を「追加の依存ファイル」に指定しておく
ws2_32.lib のバージョンや依存関係によってはinet_ptonが使えないので「VC++ディレクトリ」を確認する
*/
#include <winsock2.h> /* windows sockets */
#include <ws2tcpip.h> /* contain ws2ipdef.h */
#include <stdio.h> /* printf */
int main() {
struct sockaddr_in6 tSockAddr = {0}; // 構造体は初期化しておかないとエラーになる
char auPkt[] = "Hello IPv6 World!!";
int auPktLen = strlen(auPkt);
// WinSock初期化
WORD wVersionRequested = MAKEWORD(2, 2); // 使用するWinSockのバージョン要求
WSADATA wsaData; // WinScokデータ構造体
int nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (nErrorStatus != 0) {
printf("初期化失敗です\n");
return -1;
}
/* ソケット生成 */
int iSocket = (int)socket(AF_INET6, (int)SOCK_DGRAM, IPPROTO_UDP);
if (iSocket == -1) {
printf("socket error\n");
return -1;
}
/* sockaddr_in6 構造体の設定 */
tSockAddr.sin6_family = AF_INET6;
tSockAddr.sin6_port = htons(5001);
// 『送り先のIP』を tSockAddr.sin6_addr に格納(マルチキャストなら(FF00::/8)を指定)
// 古いws2_32.libには存在しない事もあるので注意
#if 1
inet_pton(AF_INET6, "FF00::", &(tSockAddr.sin6_addr));
#else
tSockAddr.sin6_addr.u.Byte[0] = 0xFF;
tSockAddr.sin6_addr.u.Byte[1] = 0x00;
tSockAddr.sin6_addr.u.Byte[2] = 0x00;
tSockAddr.sin6_addr.u.Byte[3] = 0x00;
tSockAddr.sin6_addr.u.Byte[4] = 0x00;
tSockAddr.sin6_addr.u.Byte[5] = 0x00;
tSockAddr.sin6_addr.u.Byte[6] = 0x00;
tSockAddr.sin6_addr.u.Byte[7] = 0x00;
tSockAddr.sin6_addr.u.Byte[8] = 0x00;
tSockAddr.sin6_addr.u.Byte[9] = 0x00;
tSockAddr.sin6_addr.u.Byte[10]= 0x00;
tSockAddr.sin6_addr.u.Byte[11]= 0x00;
tSockAddr.sin6_addr.u.Byte[12]= 0x00;
tSockAddr.sin6_addr.u.Byte[13]= 0x00;
tSockAddr.sin6_addr.u.Byte[14]= 0x00;
tSockAddr.sin6_addr.u.Byte[15]= 0x00;
#endif
int iRet = sendto(iSocket, (const void *)auPkt, auPktLen, 0,
(struct sockaddr*)&tSockAddr, sizeof(tSockAddr));
if (iRet < 0)
{
printf("error=%d\n", WSAGetLastError());
}
closesocket(iSocket);
WSACleanup();
return iRet;
}