우리 프로젝트에는 고정 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
미리 감사드립니다