デバイスIPの変更後にUDPマルチキャストに問題が発生する

デバイスIPの変更後にUDPマルチキャストに問題が発生する

私たちのプロジェクトには、静的IPアドレスを持つLinux 4.1カーネルを使用するUDPマルチキャストが必要です。

データを送信するためにsendto関数を使用するデフォルトのUDPマルチキャストは、デバイス固定IP 10.13.204.100で正しく機能します。デバイスのIPを10.13.204.101または同じシリーズの他のIPに変更すると問題が発生し、UDPマルチキャストにエラーが表示されます。

sendto: network unreachable

以下のようにUDPを初期化しています。

int udp_init()
{
    char multicastTTL = 10;
    // Create UDP socket:
    memset(&socket_desc, 0, sizeof(socket_desc));
    socket_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (socket_desc < 0)
    {
        perror("socket");
        return 1;
    }
    udp_socket_fd = socket_desc;
    printf("udp_socket_fd=>%d\nsocket_desc==>%d\n", udp_socket_fd, socket_desc);

    /* Set the TTL (time to live/hop count) for the send */
    // if (setsockopt(socket_desc, IPPROTO_IP, IP_MULTICAST_TTL, &multicastTTL, sizeof(multicastTTL)) < 0)
    if (setsockopt(socket_desc, SOL_SOCKET, SO_REUSEADDR, &multicastTTL, sizeof(multicastTTL)) < 0)
    {
        perror("setsockopt");
        exit(1);
    }

    memset(&server_addr, 0, sizeof(server_addr)); /* Zero out structure */
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP); // INADDR_ANY;
    server_addr.sin_port = htons(EXAMPLE_PORT);             // htons(udp_port);

    // bind to receive address
    //
    if (bind(socket_desc, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("bind");
        printf("line %s-->%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
        return 1;
    }
}

IP が変更されたら、次のコマンドを使用して UDP ソケットを閉じます。

close(socket_desc)

udp_init関数を使用してUDPを初期化し、sendto関数を使用してデータを転送しますが、sendto:network unreachable

事前にありがとう

ベストアンサー1

おすすめ記事