私たちのプロジェクトには、静的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
事前にありがとう