C++ 收听UDP广播
我需要通过UDP收听网络广播。数据报包含一个j4cDAC_广播结构。我试着遵循一些教程,但他们似乎遗漏了一些东西,没有非常详细的解释,如果有的话 根据我现在的情况,我得到一个错误绑定失败10049,错误10049表示地址不可用。广播时间是255.255.255.255:7654。如何修复此错误 这就是我到目前为止所做的:C++ 收听UDP广播,c++,udp,broadcast,winsock2,C++,Udp,Broadcast,Winsock2,我需要通过UDP收听网络广播。数据报包含一个j4cDAC_广播结构。我试着遵循一些教程,但他们似乎遗漏了一些东西,没有非常详细的解释,如果有的话 根据我现在的情况,我得到一个错误绑定失败10049,错误10049表示地址不可用。广播时间是255.255.255.255:7654。如何修复此错误 这就是我到目前为止所做的: void test() { WSADATA wsd; SOCKET s; j4cDAC_broadcast recieve; cha
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,或为所有IP绑定到0.0.0.0。广播仍将到达套接字。这就是为什么它是广播。这个包的逻辑被发送到一个广播地址,这意味着我们希望在TCP/IP堆栈级别接收它 不要绑定到127.0.0.1
要获取发件人地址,请使用recvfrom并记下倒数第二个参数。您不必绑定到broacast地址;您可以绑定到机器的本地IP,或为所有IP绑定到0.0.0.0。广播仍将到达套接字。这就是为什么它是广播。这个包的逻辑被发送到一个广播地址,这意味着我们希望在TCP/IP堆栈级别接收它 不要绑定到127.0.0.1
要获取发送者的地址,请使用recvfrom并记下倒数第二个参数。在Python中,如果打开多个客户端,至少0.0.0.0不起作用,因此您所拥有的是点对点的,从而打破了广播的概念。绑定到本地IP(例如192.168.1.100)根本不起作用。在Python中,如果打开多个客户端,至少0.0.0.0不起作用,因此您所拥有的是点对点的,从而打破了广播的概念。绑定到本地IP(例如192.168.1.100)根本不起作用。