Проблема такая - Linux UDP сервер не принимает широковещательные пакеты с клиентов windows (на Linux не проверял, но думая то же самое), но если указать адрес сервера, то все работает, правда не определяется адрес отправителя самого первого пакета :(
---------------------- Linux UDP server
fd_set fd;
struct timeval timeout;
int from_len, opt, res;
struct sockaddr_in sin, from_sin;
char buf[255];
sock = socket(AF_INET, SOCK_DGRAM, 0);
opt = 1;
opt = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
from_len = sizeof(opt);
memset (&sin, 0, sizeof(sin));
memset (&from_sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ADDR;
sin.sin_port = htons(_PORT);
bind(sock, (struct sockaddr *)&sin, sizeof(sin));
while (1) {
FD_ZERO(&fd);
FD_SET(sock, &fd);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
res = select(sock + 1, &fd, NULL, NULL, &timeout);
if (res == 0) continue;
res = recvfrom(sock, buf, sizeof(buf), 0, &from_sin, &from_len);
--------------------
// вывод адреса не работает на первом пакете, почему?
--------
printf("r=%d l=%d dgram (%s) recieved from (%s:%d)\n", res, from_len, buf, inet_ntoa(from_sin.sin_addr.s_addr), ntohs(from_sin.sin_port));
--------------------------------------------- Linux UDP end
---------------------------------------------Windows client
int s, opt = 1, result;
struct sockaddr_in saddr;
WSAData wsadata;
char buf[100];
fd_set fd;
timeval timeout;
result = WSAStartup(MAKEWORD(1, 1), &wsadata);
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY; // работает только с конкретным ip
saddr.sin_port = 0;
s = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(int));
bind(s, (struct sockaddr *)&saddr, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_BROADCAST;
saddr.sin_port = htons(_PORT);
memset(buf, 0, sizeof(buf));
strcat(buf, "test");
for (int i = 0; ; ) {
sendto(s, buf, strlen(buf), 0, (sockaddr *)&saddr, sizeof(saddr));
-------------------------------------Windows end
sendto возвращает 4, все как положено, но сервер пакет не ловит...
где-то должна быть ошибка, но где не понимаю...