试图通过udp套接字广播

trying to broadcast through udp socket

本文关键字:套接字 广播 udp      更新时间:2023-10-16

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

下面是我的代码:
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,它会给我一个发送错误("No error"),这让我很困惑。此外,如果我用客户端发送一些东西,它将开始广播,但如果我连接到另一个客户端,只有第一个客户端接收广播。

提前谢谢你。我怀疑这很重要,但我正试图广播当前时间。

您没有初始化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;

看起来您的Sender_addr从未被初始化,因此,当您删除recvfrom时,您会得到一个错误,当recvfrom到位时,它正在填充第一个客户端连接的地址(但从未更新)。

如果你不知道你想要广播的客户端的地址,你需要设置一些握手,他们给你发送一个ping,你用recvfrom接收它,你把他们的地址存储在一个列表或其他东西中。然后,当您广播时,您需要将消息发送到列表中的每个客户端地址。