首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP定向广播(WinSock2)失败

UDP定向广播(WinSock2)失败
EN

Stack Overflow用户
提问于 2022-03-04 21:44:25
回答 1查看 48关注 0票数 1

首先,让我说,这是我第一次进入C世界后,经过了20+多年的组装编程为PLC和MicroControllers。

我试图将UDP数据报发送到网络广播地址,在本例中是192.168.1.255。

我得到的错误是错误代码10049 (来自WSAGetLastError())的绑定失败。从附加的代码中可以看到,我已经创建了套接字,填充了sockaddr_in,并将setsockopt()创建为SO_BROADCAST。

对于我的生活,我不知道我做错了什么,任何指点都会被感激地接受。

代码语言:javascript
复制
iResult = WSAStartup(MAKEWORD(2, 2), &wsaTxData);
if (iResult != NO_ERROR)
{
    WSAErrorString("WSAStartup for TX failed");
    return(-1);
}
XPLMDebugString("UDP Server: WSAStartup TX complete.\n");

if ((BeaconSocket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
    WSAErrorString("UDP Server: Could not create BECN socket");
    return(-1);
}

// setup the sockaddr_in structure
//
si_beacon.sin_family = AF_INET;
si_beacon.sin_addr.s_addr = inet_addr("192.168.1.255");
si_beacon.sin_port = htons(_UDP_TX_PORT);

// setup to broadcast
//
char so_broadcast_enabled = '1';
if (setsockopt(BeaconSocket, SOL_SOCKET, SO_BROADCAST, &so_broadcast_enabled, sizeof(so_broadcast_enabled)) == SOCKET_ERROR) {
    WSAErrorString("Error in setting Broadcast option");
    closesocket(BeaconSocket);
    return(-1);
}

// bind our socket
//
if (bind(BeaconSocket, (struct sockaddr *)&si_beacon, sizeof(si_beacon)) == SOCKET_ERROR)
{
    char buf[256];
    WSAErrorString("Bind to socket for UDP beacon failed");
    sprintf(buf, "Port %u, address %s\n", ntohs(si_beacon.sin_port), inet_ntoa(si_beacon.sin_addr));
    XPLMDebugString(buf);
    return(-1);
}

// start the UDP beacon
//
udp_becn_thread_id = CreateThread(NULL, 0, BeaconThread, NULL, 0, NULL);
if (!udp_becn_thread_id) {
    WSAErrorString("UDP Server: Error starting UDP Beacon");
    return (-1);
}

XPLMDebugString("UDP Server: bind complete. beacon ACTIVE.\n");


return(0);
EN

回答 1

Stack Overflow用户

发布于 2022-03-04 22:23:33

问题在于IP地址本身。

我将代码复制到我的计算机上(对其做了一些修改以使其编译),并得到了错误:

代码语言:javascript
复制
UDP Server: WSAStartup TX complete.
Bind to socket for UDP beacon failed
Port 47977, address 192.168.1.255

然后,我改变了行文:

代码语言:javascript
复制
si_beacon.sin_addr.s_addr = inet_addr("192.168.1.255");

代码语言:javascript
复制
si_beacon.sin_addr.s_addr = inet_addr("192.168.0.127");

当我再次运行它时,一切正常:

代码语言:javascript
复制
UDP Server: WSAStartup TX complete.
Done successfully

问题是,“绑定”地址需要是本地网络上的您的计算机地址。而不是远程客户端。

另一种选择是使用地址:

代码语言:javascript
复制
si_beacon.sin_addr.s_addr = inet_addr("0.0.0.0");

它同时绑定到计算机上的所有网络接口。

作为参考,下面是我使用的代码的版本:

代码语言:javascript
复制
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#include <WinSock2.h>
#include <WS2tcpip.h> // For inet_pton

#pragma comment(lib, "ws2_32.lib")

int main()
{
    {
        WSADATA wsaTxData;
        memset(&wsaTxData, 0, sizeof(WSADATA));
        const int iResult = WSAStartup(MAKEWORD(2, 2), &wsaTxData);
        if (iResult != NO_ERROR)
        {
            printf("%s", "WSAStartup for TX failed.\n");
            return -1;
        }
        printf("%s", "UDP Server: WSAStartup TX complete.\n");
    }

    SOCKET BeaconSocket;
    memset(&BeaconSocket, 0, sizeof(SOCKET));

    if ((BeaconSocket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
        printf("%s", "UDP Server: Could not create BECN socket\n");
        return -1;
    }

    // setup the sockaddr_in structure
    //
    sockaddr_in si_beacon;
    memset(&si_beacon, 0, sizeof(sockaddr_in));
    si_beacon.sin_family = AF_INET;
    si_beacon.sin_addr.s_addr = inet_addr("0.0.0.0");
    const unsigned short port_num = 0xbb69;
    si_beacon.sin_port = htons(port_num);

    // setup to broadcast
    //
    char so_broadcast_enabled = '1';
    if (setsockopt(BeaconSocket, SOL_SOCKET, SO_BROADCAST, &so_broadcast_enabled, sizeof(so_broadcast_enabled)) == SOCKET_ERROR) {
        printf("%s", "Error in setting Broadcast option\n");
        closesocket(BeaconSocket);
        return(-1);
    }

    // bind our socket
    //
    if (bind(BeaconSocket, (struct sockaddr*)&si_beacon, sizeof(si_beacon)) == SOCKET_ERROR)
    {
        char buf[256];
        printf("%s", "Bind to socket for UDP beacon failed\n");
        sprintf_s(buf, "Port %u, address %s\n", ntohs(si_beacon.sin_port), inet_ntoa(si_beacon.sin_addr));
        printf("%s", buf);
        return(-1);
    }

    printf("%s", "Done successfully");

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71357517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档