gpt4 book ai didi

c++ - 收听 UDP 广播

转载 作者:行者123 更新时间:2023-11-30 02:07:18 26 4
gpt4 key购买 nike

我需要收听来自 UDP 的网络广播。数据报包含一个 j4cDAC_broadcast 结构。我尝试按照一些教程进行操作,但它们似乎遗漏了一些内容并且没有非常详细的解释(如果有的话)。

我现在得到的是错误 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();
}

此外,我找不到的另一件事是如何从 header 中获取发件人的 IP 地址。

最佳答案

您不绑定(bind)广播地址;您绑定(bind)到机器的本地 IP(或所有机器的 0.0.0.0)。广播将完全相同地到达套接字。这就是为什么它是广播。 “这个数据包被发送到广播地址,意味着我们想要接收它”的逻辑发生在 TCP/IP 堆栈级别。

不要绑定(bind)到 127.0.0.1。

要获取发件人的地址,请使用 recvfrom() 并记下倒数第二个参数。

关于c++ - 收听 UDP 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com