c++ - 尝试通过 udp 套接字广播

标签 c++ sockets udp winsock broadcast

我的广播服务器遇到了问题。基本上,我希望它从我启动它的那一刻起就连续发送广播。由于某种原因,它在收到来自某处的连接之前不会启动。我肯定搞砸了一些事情,但我不知道是什么。

这是我的代码:

WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    SOCKET sock;
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    char broadcast = 'a';

    if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0)
    {
        perror("broadcast options");
        closesocket(sock);
        return 1;
    }
    struct sockaddr_in Recv_addr;
    struct sockaddr_in Sender_addr;
    int len = sizeof(struct sockaddr_in);
    char recvBuff[50];
    int recvBuffLen = 50;
    //char sendMsg[] = "broadcast message from salam rofl";

    Recv_addr.sin_family = AF_INET;
    Recv_addr.sin_port = htons(PORT);
    Recv_addr.sin_addr.s_addr = INADDR_ANY;

    if(bind(sock, (sockaddr*)&Recv_addr, sizeof(Recv_addr)) < 0)
    {
        perror("bind");
        _getch;
        closesocket(sock);
        return 1;
    }

    //recvfrom(sock, recvBuff, recvBuffLen, 0, (sockaddr *)&Sender_addr, &len);
    //cout << "\nreceived message: " << recvBuff;

    while(1)
    {
        Sleep(3000);


        //_getch();

        getTime();
        if(sendto(sock, currentTime, strlen(currentTime)+1, 0, (sockaddr *)&Sender_addr, sizeof(Sender_addr)) < 0)
        {
            perror("borhot send: ");
            _getch();
            closesocket(sock);
            return 0;
        }
        else cout << "message sent successfully";
    }

    _getch;
    closesocket(sock);
    WSACleanup();
    return 0;

基本上,如果我删除recvfrom,它会给我一个发送错误(“无错误”),这让我很困惑。另外,如果我通过客户端向它发送一些内容,它将开始广播,但如果我与另一个客户端连接,则只有第一个客户端正在接收广播。

提前谢谢您。 我怀疑这是否重要,但我正在尝试广播当前时间。

最佳答案

您没有初始化Sender_Addr,因此您没有告诉sendto()实际广播到哪里。

试试这个:

WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET)
{
    perror("socket creation");
    _getch;
    return 1;
}

BOOL enabled = TRUE;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&enabled, sizeof(BOOL)) < 0)
{
    perror("broadcast options");
    _getch;
    closesocket(sock);
    return 1;
}

struct sockaddr_in Sender_addr;
Sender_addr.sin_family = AF_INET;
Sender_addr.sin_port = htons(BROADCAST_PORT);
Sender_addr.sin_addr.s_addr = inet_addr("Broadcast IP Here");

struct sockaddr_in Recv_addr;
Recv_addr.sin_family = AF_INET;
Recv_addr.sin_port = htons(PORT);
Recv_addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (sockaddr*)&Recv_addr, sizeof(Recv_addr)) < 0)
{
    perror("bind");
    _getch;
    closesocket(sock);
    return 1;
}

while(1)
{
    Sleep(3000);

    getTime();
    if (sendto(sock, currentTime, strlen(currentTime)+1, 0, (sockaddr *)&Sender_addr, sizeof(Sender_addr)) < 0)
    {
        perror("borhot send: ");
        _getch();
        closesocket(sock);
        return 0;
    }

    cout << "message sent successfully";
}

_getch;
closesocket(sock);

WSACleanup();
return 0;

关于c++ - 尝试通过 udp 套接字广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16973543/

相关文章:

c++ - G726 ADPCM缓冲怎么玩?

c++ - 为什么这个循环会破坏数组?

ios - 无法写入使用 CFStreamCreatePairWithSocket 成功创建的 CFWriteStream

node.js - 在 mongodb 中保存未知 JS 对象的字符串表示

java - 如何在Spring框架中实现UDP

c++ - windows下如何监控进程网络使用情况

c++ - 为 C++ Windows 服务动态创建安装程序

python - Python 游戏中的非阻塞 UDP 服务器?

java - 如何在 Axis 中禁用 SSLv2 套接字协议(protocol)

java - 如何通过 UDP 服务器/客户端发送数组列表