在以下兩個問題中掙扎兩天:如果發送方訂閱了多播組,則環回數據包是否會通過接入點返回給發送方?即使情況並非如此,是否有可能強制通過AP進行環回?如果啓用了環回,爲什麼發送者不能收到其多播UDP數據包?
此外,爲什麼不使用下面的代碼循環工作?
char * server_addr_name = "239.255.0.1"; // multicast group
int port_number = 8888;
int enable_loopback = 1;
int udp_socket;
struct message msg; // random message
char buffer[BUFFER_SIZE];
/* create socket */
struct sockaddr_in server_addr, rcv_addr;
socklen_t server_addr_size = sizeof(struct sockaddr_in);
socklen_t rcv_addr_size = sizeof(struct sockaddr_in);
/* initialize socket */
memset(& server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_addr_name);
server_addr.sin_port = htons(port_number);
if ((udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
fprintf(stderr, "Error initializing UDP socket.\n");
exit(EXIT_FAILURE);
}
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(server_addr_name);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, & mreq, sizeof(mreq)) < 0) {
fprintf(stderr, "Error on setting multicast membership on socket.\n");
exit(EXIT_FAILURE);
}
unsigned char do_enable = (unsigned char) enable_loopback;
if (setsockopt(udp_socket, IPPROTO_IP, IP_MULTICAST_LOOP,
& do_enable, sizeof(do_enable)) < 0) {
fprintf(stderr, "Error on setting multicast loopback on socket.\n");
exit(EXIT_FAILURE);
}
int read_size = 0;
while (1) {
/* send the packet */
if (sendto(udp_socket, &msg, sizeof(struct message), 0,
(struct sockaddr *) & server_addr, server_addr_size) == -1) {
fprintf(stderr, "Error on sending UDP packet.\n");
}
else
printf("Sent my message.\n");
/* get response from the server/multicast address */
read_size = recvfrom(udp_socket, buffer, BUFFER_SIZE, 0,
(struct sockaddr *) & rcv_addr, & rcv_addr_size);
if (read_size < 1)
break;
else
printf("Got my packet!\n");
}
任何幫助表示讚賞。
你如何測試?你是否在發送者和接收者在同一臺機器上的測試環境中?如果是這樣,我會建議嘗試使用127.0.0.1作爲IP,並修改您的主機文件添加一行:127.0.0.1主機名,其中主機名是計算機名。我有時會遇到這個問題。 – Picarus 2014-09-19 08:27:42
@Picarus這隻會讓一切變得更糟。 – EJP 2014-09-19 09:37:22
@EJP,我的觀點是第一,調試問題以查看它是否是網絡問題,其次,有時表示問題不在代碼中,而是在系統配置中。你爲什麼認爲這可能會更糟?它可以解決問題,但它可以幫助帶來光線 – Picarus 2014-09-20 10:05:48