I have to receive an UDP broadcast (in Ubuntu if that makes any difference). Using Wireshark, I can see the packet being sent from the server machine, and I can see it being received by my client machine, but my program is completely oblivious. This is what I have:
sockaddr_in si_me, si_other;
int s;
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
int port=6000;
int broadcast=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST,
&broadcast, sizeof broadcast);
memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;
assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
while(1)
{
char buf[10000];
unsigned slen=sizeof(sockaddr);
recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
printf("recv: %s\n", buf);
}
It is compiled in debug mode, the asserts aren't being erased during compilation, and my program just blocks on recvfrom.
Is there any other hoop I have to jump through to receive an untargeted UDP broadcast?
Edit: just a bit more info, I have the two computers connected on a dedicated switch, no outside interference. I also have a second network card on my client computer that connects to the company network, which also works.
I can ping both the outside (Internet working) and my server machine (plus I can see the actual packets in Wireshark), but you never know what might cause this problem.
bindis binding to the wrong interface? What doesnetstat -an | grep 6000return on the client machine? - Sean Brightnetstat -anis showing no open 6000 port, I already double checked that (I also tried using the "reuse" udp flag). - Blindybind()does not actually open a port. Onlyconnect()andlisten()do that. But you do not need to open a port vialisten()in order to receive UDP broadcasts. - Remy Lebeauconnect()on a UDP socket merely establishes a static association inside the socket handle between the local and remote IP/Port pairs, nothing more. I was referring to TCP when I mentioned thatconnect()opens a port. Callingbind()on a UDP socket adds the bound IP/Port to the netstat list but it does not display any state, which is probably true of all UDP connections. - Remy Lebeau