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

あなたは正しい軌道に乗っています。受け取ったパッケージが自分からのものかどうかを確認してから、それを破棄する必要があります。

ローカル ホスト アドレスを取得する最も簡単な方法は、 と を使用することgethostnameですgethostbyname。ただし、ホストに複数のホスト名または IP アドレスがある場合、これらはうまく機能しません。可能なすべてのネットワーク アドレスを取得する方法については、SO (または Google) を検索してください。

于 2012-05-25T05:04:35.940 に答える
-1

recvfromアドレスを教えてくれます。それを使用します。

どのアドレスと照合するかについては、多くのシステム (おそらく関心のあるシステム) でローカル IP アドレスを取得できますgetifaddrs。ただし、これは POSIX にはありません。

于 2012-05-25T05:21:06.430 に答える
-1

自己ブロードキャストを受信しないように、プログラムのブロードキャスト宛先ポートをマシンでブロックする必要があります。

そのポートで受信した (または必要に応じて) パケットをiptablesドロップできます。TCPUDP

于 2012-05-25T00:51:49.900 に答える