收听UDP广播
问题描述:
我需要监听通过UDP发送的网络广播。该数据报包含一个j4cDAC_broadcast
结构。我已经尝试了几个教程,但他们似乎留下了一些东西,并没有非常详细的解释,如果有的话。收听UDP广播
我现在正在收到错误BIND FAILED 10049
,并且错误10049指示地址不可用。广播进入255.255.255.255:7654。我如何解决这个错误?
这是我到目前为止有:
void test()
{
WSADATA wsd;
SOCKET s;
j4cDAC_broadcast recieve;
char *read = (char*) malloc(sizeof(j4cDAC_broadcast));
int ret;
DWORD dwSenderSize;
sockaddr_in local;
if (WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
cout << "WSAStartup failed";
exit(1);
}
local.sin_family = AF_INET;
local.sin_port = htons ((short)BCASTPORT);
local.sin_addr.s_addr = inet_addr(BCASTIP);
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
cout << "SOCKET FAILED!: " << WSAGetLastError();
exit(1);
}
int bnd = bind(s,(SOCKADDR*) &local,sizeof(local));
if (bnd != 0)
{
cout << "BIND FAILED: " << WSAGetLastError(); //fails here
return;
}
ret = recv (s, read,sizeof(j4cDAC_broadcast),0);
if (ret == SOCKET_ERROR)
{
cout << "RECIEVE FAILED " << WSAGetLastError();
return;
}
memcpy(&recieve,read,sizeof(read));
closesocket(s);
WSACleanup();
}
此外,还有一点我找不到是如何获取发送者的IP地址,出了头的。
答
您不绑定到broacast地址;你绑定到本机的本地IP(或全部为0.0.0.0)。广播将同样到达插座。这就是为什么它是一个广播。 “这个数据包发送到广播地址,意味着我们想接收它”的逻辑发生在TCP/IP堆栈级别上。
不要绑定到127.0.0.1。
要获取发件人地址,请使用recvfrom()
并记下倒数第二个参数。
在Python中,如果您打开多个客户端,至少0.0.0.0不起作用,那么您现在拥有的是指向点,从而打败了广播的想法。绑定到本地IP(例如192.168.1.100)完全不起作用。 – fyngyrz