2

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

这是我的代码:

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 中删除,它会给我一个发送错误(“无错误”),这让我很困惑。另外,如果我用客户端发送一些东西,它将开始广播,但如果我与另一个客户端连接,则只有第一个客户端正在接收广播。

先感谢您。我怀疑这很重要,但我正在尝试广播当前时间。

4

2 回答 2

3

你没有初始化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;
于 2013-06-07T00:24:46.207 回答
2

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

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

于 2013-06-06T23:26:29.107 回答