[ C言語 ] マルチキャストアドレス宛へパケットを送信 ( Winsock2 IP_MULTICAST_IF )

Pocket

ここでは、マルチキャストアドレス宛へパケットを送信する C 言語のサンプルコードを掲載しています。動作環境は WindowsXP です。ネットワークのプロトコルスタックは WIndows Vista 以降大きく変わったようですので実際の使用には十分な確認が必要です。

スポンサーリンク

マルチキャストアドレス宛にパケットを送信する

サンプルとしては微妙ですが、IP アドレスを新規に追加し、追加した IP アドレスをパケットの送信元として送信しています。しかし、元々設定されている IP アドレスが送信元として使用されました。

Linux ( Fedora6 ) でも同様の実験を行ったのですが、追加した IP アドレスが送信元として期待通りに設定されていました。

    DWORD ifindex = XXXXX; // インターフェースインデックス

    struct in_addr addIPaddr;
    struct in_addr addMask;

    // 新規に割り当てる エイリアス IP アドレス
    addIPaddr.s_addr = inet_addr("10.66.34.35");
    addMask.s_addr = inet_addr("255.255.0.0");

    ULONG context, instance;

    int ret;
    // アドレスの追加
    if ((ret = AddIPAddress(addIPaddr.s_addr, 
                            addMask.s_addr, 
                            ifindex, 
                            &context, 
                            &instance) ) != NO_ERROR) {
        printf("IP address added failed with error: %d.\n", ret);
        return -1;
    }

    /* Windows 独自の設定 */
    WSADATA data;
    WSAStartup(MAKEWORD(2,0), &data);

    struct sockaddr_in addr;
    DWORD ipaddr;

    DWORD sock = socket(AF_INET, SOCK_DGRAM, 0);

    // マルチキャスト送信元IPアドレスの設定をsetsockopt()で行う 
    // ここでは、追加したエイリアスIPを指定する
    ipaddr = inet_addr("10.66.34.35");
    if (setsockopt(sock,
                   IPPROTO_IP,
                   IP_MULTICAST_IF,
                   (char *)&ipaddr, 
                   sizeof(ipaddr)) != 0) {
        printf("setsockopt : %d\n", WSAGetLastError());
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr = inet_addr("239.0.0.9");
    
    // パケット送信
    sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

    closesocket(sock);
    WSACleanup();

    // 追加した IP アドレスを削除
    if ((ret = DeleteIPAddress(context)) != NO_ERROR) {
        printf("DeleteIPAddress failed with error: %d.\n", ret);
        return -1;
    }

実験は失敗に終わりましたが、マルチキャストアドレス宛にパケットの送信は行うことができました。最近の OS でどうなっているかは未検証です。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *