组播回显服务器

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() 来找出它收到的任何数据包的单播源地址,因此它很容易知道将回复数据包发送回哪里)

第三种选择是以某种方式修改数据包的内容以将其标记为已经看到,这样您的服务器就知道不会再次回显它。例如,您可以指定您的服务器将只回显第一个字节设置为零的数据包,并且当您的服务器回显一个数据包时,它确保在发送()之前将数据包的第一个字节设置为一个。 (当然,您的客户需要了解此约定)