3

当我通过下面的代码广播消息时,主机上的服务器也收到了消息,如何防止主机接收到它发送的消息?

是否可以更改代码上的某些内容或者使用类似的内容会更好if (strcmp(hostIP == IP_of_the_package) == 0) { <discard the msg>}?主机从 DHCP 获取 IP,我该如何定义hostIP as a variable和如何提取IP addr of the packet

void boardcast_msg(char *mess){
   int sock;                        
   struct sockaddr_in broadcastAddr; 
   char *broadcastIP;                
   unsigned short broadcastPort;     
   char *sendString;                 
   int broadcastPermission;         
   int sendStringLen;                

   broadcastIP = "255.255.255.255";  
   broadcastPort = 33333;

   sendString = mess;             /*  string to broadcast */


   if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
       fprintf(stderr, "socket error");
        exit(1);
   }


   broadcastPermission = 1;
   if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission,sizeof(broadcastPermission)) < 0){
       fprintf(stderr, "setsockopt error");
       exit(1);
   }

   /* Construct local address structure */
   memset(&broadcastAddr, 0, sizeof(broadcastAddr));   
   broadcastAddr.sin_family = AF_INET;                 
   broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP);
   broadcastAddr.sin_port = htons(broadcastPort);       

   sendStringLen = strlen(sendString);  

        /* Broadcast sendString in datagram to clients */
        if (sendto(sock, sendString, sendStringLen, 0, (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)) != sendStringLen){
            fprintf(stderr, "sendto error");
            exit(1);
        }

}
4

4 回答 4

2

禁用环回,这样您就不会收到自己的数据报:

char loopch=0;

if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP,
               (char *)&loopch, sizeof(loopch)) < 0) {
  perror("setting IP_MULTICAST_LOOP:");
  close(sd);
  exit(1);
}

来自: http: //publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp ?topic=%2Frzab6%2Frzab6x1multicast.htm

于 2013-05-05T20:03:06.227 回答
1

您走在正确的轨道上,您需要查看收到的包裹是否来自您自己,然后将其丢弃。

获取本地主机地址的最简单方法是使用gethostnamegethostbyname。但是,如果您的主机有多个主机名或 IP 地址,这些将无法正常工作。搜索 SO(或 Google)以了解如何获取所有可能的网络地址。

于 2012-05-25T05:04:35.940 回答
-1

您的程序的广播目标端口应该在您的机器上被阻止以避免接收自广播。

在您的iptables您可以丢弃(TCPUDP根据需要)在该端口上接收到的数据包。

于 2012-05-25T00:51:49.900 回答
-1

recvfrom会给你一个地址。用那个。

至于要匹配的地址,在许多系统(可能是您关心的系统)上,您可以使用getifaddrs. 但是,这不在 POSIX 中。

于 2012-05-25T05:21:06.430 回答