组播回显服务器
Multicast echo server
这更多是概念上的混淆。我正在制作一个多播服务器,它只回显数据报 received.Here 的代码
while (1) {
cnt = recvfrom(sock, message, sizeof(message), 0,
(struct sockaddr *) &addr, &addrlen);
//printf("%d \n",cnt);
if (cnt < 0) {
perror("recvfrom");
exit(1);
} else if (cnt == 0) {
break;
}
printf("%s: message = \"%s\"\n", inet_ntoa(addr.sin_addr), message);
addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP);
cnt = sendto(sock, message, sizeof(message), 0,
(struct sockaddr *) &addr, addrlen);
if (cnt < 0) {
perror("sendto");
exit(1);
}
}
问题在于多播服务器也将接收数据报。因此,在它收到一个数据报后,它发送,它再次收到相同的数据报,如此进入无限循环。关于如何实现此类服务器的任何指示?
您需要通过setsockopt().
禁用多播环回
一个选项是 EJP 所说的,禁用多播环回,这样发送机器就不会收到它自己的多播数据包的副本。但是,请注意,如果您这样做,您将无法再在同一台机器上测试所有 运行 的客户端和服务器,因为 IP_MULTICAST_LOOP is implemented at the IP routing level.
避免无限数据包循环的第二种可能的选择是让 echo-server 将其响应数据包发送到与其侦听的组不同的多播组(或者甚至让它通过单播而不是多播发送响应) ; 服务器可以调用 recvfrom() 来找出它收到的任何数据包的单播源地址,因此它很容易知道将回复数据包发送回哪里)
第三种选择是以某种方式修改数据包的内容以将其标记为已经看到,这样您的服务器就知道不会再次回显它。例如,您可以指定您的服务器将只回显第一个字节设置为零的数据包,并且当您的服务器回显一个数据包时,它确保在发送()之前将数据包的第一个字节设置为一个。 (当然,您的客户需要了解此约定)
这更多是概念上的混淆。我正在制作一个多播服务器,它只回显数据报 received.Here 的代码
while (1) {
cnt = recvfrom(sock, message, sizeof(message), 0,
(struct sockaddr *) &addr, &addrlen);
//printf("%d \n",cnt);
if (cnt < 0) {
perror("recvfrom");
exit(1);
} else if (cnt == 0) {
break;
}
printf("%s: message = \"%s\"\n", inet_ntoa(addr.sin_addr), message);
addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP);
cnt = sendto(sock, message, sizeof(message), 0,
(struct sockaddr *) &addr, addrlen);
if (cnt < 0) {
perror("sendto");
exit(1);
}
}
问题在于多播服务器也将接收数据报。因此,在它收到一个数据报后,它发送,它再次收到相同的数据报,如此进入无限循环。关于如何实现此类服务器的任何指示?
您需要通过setsockopt().
一个选项是 EJP 所说的,禁用多播环回,这样发送机器就不会收到它自己的多播数据包的副本。但是,请注意,如果您这样做,您将无法再在同一台机器上测试所有 运行 的客户端和服务器,因为 IP_MULTICAST_LOOP is implemented at the IP routing level.
避免无限数据包循环的第二种可能的选择是让 echo-server 将其响应数据包发送到与其侦听的组不同的多播组(或者甚至让它通过单播而不是多播发送响应) ; 服务器可以调用 recvfrom() 来找出它收到的任何数据包的单播源地址,因此它很容易知道将回复数据包发送回哪里)
第三种选择是以某种方式修改数据包的内容以将其标记为已经看到,这样您的服务器就知道不会再次回显它。例如,您可以指定您的服务器将只回显第一个字节设置为零的数据包,并且当您的服务器回显一个数据包时,它确保在发送()之前将数据包的第一个字节设置为一个。 (当然,您的客户需要了解此约定)