1

我需要收听来自 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();
    }

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

4

1 回答 1

4

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

不要绑定到 127.0.0.1。

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

于 2011-11-05T02:53:14.043 回答