Intereting Posts
Как напечатать строку с завершающим нулевым символом с символами новой строки, не показывая обратную косую черту в gdb? Динамический массив в C – Является ли мое понимание malloc и realloc правильным? Почему objdump не показывает разделы .bss, .shstratab, .symtab и .strtab? Неверный вывод данных при разветвлении C макрос, что-то странное Самый простой способ рассчитать количество четных чисел в заданном диапазоне Исправить для разыменования тип-караульный указатель нарушит строгое сглаживание Упражнение 1-18 K & R. Как я должен удалить пробел? Поиск отсутствующих элементов в массиве Назначение и точки последовательности: как это неоднозначно? Сохранение и доступ к двумерному массиву в структуре Код возврата из pthread_create () равен 11 Как я могу получить / установить член структуры смещением C OpenMP параллельная сортировка пузырьков реализация функции glibc rand

UDP вещание на C

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

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

Отключите loopback, чтобы вы не получали свои собственные датаграммы:

 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

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

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

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

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

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

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