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 に答える