Я использую BSD-сокетов в Ubuntu 9.10 для отправки пакетов UDP в эфир с помощью следующего кода:UDP сокеты в специальной сети (Ubuntu 9.10)
sock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
//sock_fd=socket(AF_INET,SOCK_DGRAM,0);
receiver_addr.sin_family = PF_INET;
//does not send with broadcast in ad hoc
receiver_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
inet_aton("169.254.255.255",&receiver_addr.sin_addr);
receiver_addr.sin_port = htons(port);
int broadcast = 1;
// this call is what allows broadcast packets to be sent:
if (setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broadcast,
sizeof broadcast) == -1) {
perror("setsockopt (SO_BROADCAST)");
exit(1);
}
ret=sendto(sock_fd, packet, size, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr));
Обратите внимание, что не весь код, это только иметь идею.
Программа отправляет все данные с помощью INADDR_BROADCAST, если я подключен к беспроводной сети инфраструктуры. Однако, если мой ноутбук подключен к сети ad-hoc, он может получать все данные, но не отправлять их. Я решил проблему, используя широковещательный адрес 169.254.255.255, но я хотел бы знать, что происходит.
Спасибо заранее!
«Не отправлять» означает, что функция возвращает ошибку или другие компьютеры в сети не видят этот пакет? –
Попробуйте tcpdump или wirehark и сообщите нам, что происходит .. Как вы заключаете, что вы не можете отправлять пакеты? – Jack
Он возвращает -1 ... извините за поздний ответ! – Ekhiotz