izuki
6/15/2017 - 1:50 AM

IPv6(UDP)の通信

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