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

Pocket

ここでは、Linux や Unix 系 OS から、C言語でマルチキャストアドレス宛のパケットを送信するサンプルを掲載しています。

スポンサーリンク

マルチキャスト宛へパケットを送信

マルチキャスト宛へパケットを送信するサンプルコードになります。ポイントは setsockopt 関数で送信元となるデバイス(IPアドレス)を設定 ( IP_MULTICAST_IF ) している部分です。詳細はサンプル内のコメントを参照ください。

/* マルチキャスト宛へのパケット送信処理 */
int send_mutipkt(char* snd_buf, int snd_len)
{
    int snd_total = 0;
    int ret;
    struct sockaddr_in addr;
    struct sockaddr_in src_addr;
    
    src_addr.s_addr = inet_addr("10.66.34.100"); // 送信元のIPアドレス

    int s = socket(AF_INET, SOCK_DGRAM, 0);

    // マルチキャスト送信インタフェースの設定
    // 送信元のアダプタ(IPアドレス)を設定
    ret = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, 
                     (char *)&src_addr.s_addr, sizeof(src_addr.s_addr));
    if(ret < 0) {
        perror("setsockopt(IP_MULTICAST_IF)");
        return -1;
    }

    // 送信先のマルチキャストアドレスとポート番号を設定
    addr.sin_family = AF_INET;
    addr.sin_port = htons(23456);
    addr.sin_addr.s_addr = inet_addr("239.0.0.9");

    while(snd_total < snd_len) {
        // パケットを送信
        ret = sendto(s, snd_buf + snd_total, snd_len - snd_total, 0, 
                     (const sockaddr *)&addr, sizeof(addr));
        if(ret < 0) {
            perror("sendto");
            return -1;
        }
        snd_total += ret;
    }
    close(s);
    
    return 0;
}
スポンサーリンク


Pocket

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>