簡體   English   中英

發送廣播winsock c ++

[英]sending broadcasts winsock c++

我試圖在3秒內播放一次當前時間,在10秒內播放一次當前日期。 我正在產生3個線程:1個監聽器,1個廣播時間和1個廣播日期。 這個應用程序發生在我的筆記本電腦上。

我在我的桌面(同一個內部網)上有一個udp監聽器,用它檢查我的廣播。

當我在筆記本電腦上啟動廣播應用程序時,我立即在桌面監聽器上收到時間和日期(這顯然是預期的)。 問題是我只收到前2個廣播(時間和日期)。 后續的廣播沒有被我的桌面監聽器捕獲,我無法解釋原因。 我的筆記本電腦應用程序(廣播)也有一個聽眾,它很好地接收它們。

桌面監聽器接收第一組廣播,告訴我廣播正在工作,但我無法理解為什么筆記本電腦接收所有廣播而聽眾沒有。

這是完整的廣播應用程序代碼(它很長),非常感謝任何幫助。

#include <iostream>
#include <conio.h>
#include <WinSock2.h>
#include <ctime>
#include <string>
#include <Windows.h>
#include <process.h>
#include <conio.h>

#pragma comment (lib, "ws2_32.lib")
using namespace std;
#define PORT 7777

struct tm *currentTimeAndDate;
char currentDate[16];
char currentTime[16];

SOCKET sock;
char recvBuff[50];
int recvBuffLen = 50;
struct sockaddr_in Recv_addr;
struct sockaddr_in Sender_addr;
int len = sizeof(struct sockaddr_in);

void getDate()
{
    string s;
    char a[100];
    time_t t = time(0); // get time now
    struct tm *now = localtime(&t);
    strftime(currentDate, 80, "%d/%m/%Y", now);
}

void getTime()
{
    string s;
    char a[100];
    time_t t = time(0); // get time now
    struct tm *now = localtime(&t);
    strftime(currentTime, 80, "%H:%M:%S", now);
}

void recvFunct(void *param)
{
    while(1)
    {
        recvfrom(sock, recvBuff, recvBuffLen, 0, (sockaddr *)&Sender_addr, &len);
        cout << "received message: " << recvBuff << endl;
    }
}

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

void sendFunct2(void *param)
{
    while(1)
    {
        getDate();
        if(sendto(sock, currentDate, strlen(currentDate)+1, 0, (sockaddr *)&Sender_addr, sizeof(Sender_addr)) < 0)
        {
            perror("borhot send: ");
            _getch();
            closesocket(sock);
        }
        Sleep(10000);
    }
}

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    char broadcast = 'a';

    if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0)
    {
        perror("broadcast options");
        _getch();
        closesocket(sock);
        return 1;
    }

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

    Sender_addr.sin_family = AF_INET;
    Sender_addr.sin_port = htons(PORT);
    Sender_addr.sin_addr.s_addr = inet_addr("255.255.255.255");

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

    _beginthread(recvFunct, 0, NULL);
    _beginthread(sendFunct1, 0, NULL);
    _beginthread(sendFunct2, 0, NULL);

    cout << "spawned threads, press any key to exit.. \n";
    _getch();
    closesocket(sock);
    WSACleanup();
    return 0;
}

您的recvFunct使用Sender_addr存儲發件人地址。 因此,發送功能中的目標地址會受到影響。

您筆記本電腦的網卡地址存儲在該變量中。 這就是你停止發送廣播的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM