Вопрос по c – UDP трансляция в C

3

Когда я передаю сообщение с помощью кода ниже, сервер на хост-машине также получает сообщение. Как я могу запретить хост-компьютеру получать отправленное им сообщение?

Можно ли что-то изменить в коде или лучше использовать что-то вродеif (strcmp(hostIP == IP_of_the_package) == 0) { <discard the msg>}? хост-машина получает IP от DHCP, как я могу определить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);
        }

}
возможный дубликатDisabling self-reception of UDP broadcasts Caleb

Ваш Ответ

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

Error: User Rate Limit ExceededmulticastError: User Rate Limit Exceededbroadcast.
-1

Порт назначения широковещательной передачи вашей программы должен быть заблокирован на вашем компьютере, чтобы избежать приема собственных трансляций.

в вашемiptables Вы можете бросить (TCP или жеUDP по мере необходимости) пакеты, полученные на этот порт.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Вы на правильном пути, вам нужно посмотреть, был ли полученный пакет от вас, а затем отказаться от него.

Самый простой способ получить адрес локального хоста - использоватьgethostname а такжеgethostbyname, Однако они не будут работать хорошо, если ваш хост имеет несколько имен хостов или IP-адресов. Поиск SO (или Google), как получить все возможные сетевые адреса.

-1

recvfrom даст вам адрес. Используйте это.

Что касается сопоставления адресов, во многих системах (возможно, тех, которые вам интересны) вы можете получить локальные IP-адреса сgetifaddrs, Однако это не в POSIX.

Похожие вопросы