Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发送Winsock C++广播_C++_Sockets_Broadcast - Fatal编程技术网

发送Winsock C++广播

发送Winsock C++广播,c++,sockets,broadcast,C++,Sockets,Broadcast,我试着每3秒广播一次当前时间,每10秒广播一次当前日期。我正在生成3个线程:1个侦听器、1个广播时间和1个广播日期。这个应用程序正在我的笔记本电脑上运行 我的桌面上有一个udp侦听器,与我检查广播的内联网相同 当我在笔记本电脑上启动广播应用程序时,我会立即在我的桌面侦听器上收到一个时间和日期,这显然是意料之中的。问题是我每次只接收前两次广播。我的桌面监听器没有捕捉到后续的广播,我无法解释原因。我的笔记本电脑应用程序也有一个监听程序,它可以很好地接收到广播 桌面监听器接收第一组广播,这告诉我广播正

我试着每3秒广播一次当前时间,每10秒广播一次当前日期。我正在生成3个线程:1个侦听器、1个广播时间和1个广播日期。这个应用程序正在我的笔记本电脑上运行

我的桌面上有一个udp侦听器,与我检查广播的内联网相同

当我在笔记本电脑上启动广播应用程序时,我会立即在我的桌面侦听器上收到一个时间和日期,这显然是意料之中的。问题是我每次只接收前两次广播。我的桌面监听器没有捕捉到后续的广播,我无法解释原因。我的笔记本电脑应用程序也有一个监听程序,它可以很好地接收到广播

桌面监听器接收第一组广播,这告诉我广播正在工作,但我无法理解为什么笔记本电脑接收所有广播,而监听器没有

这是完整的广播应用程序代码,非常长,非常感谢您的帮助

#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使用发件人地址存储发件人地址。因此,发送函数中的目标地址已受损

笔记本电脑的网卡地址存储在该变量中。这就是你停止发送广播的原因

您的recvFunct使用发件人地址存储发件人地址。因此,发送函数中的目标地址已受损


笔记本电脑的网卡地址存储在该变量中。这就是你停止发送广播的原因

如果您必须警告代码很长,那么这可能是您应该尝试将其缩小到更相关的部分的标志。如果我们需要更多的代码,我们会要求你提供。好吧,我认为一次发布整个代码比让人们要求更多的代码更有效。问题是我不知道错误在哪里。但我会记住这一点。如果你不得不警告你的代码很长,那么这可能是一个信号,你应该尝试把它缩小到更相关的部分。如果我们需要更多的代码,我们会要求你提供。好吧,我认为一次发布整个代码比让人们要求更多的代码更有效。问题是我不知道错误在哪里。但我会记住这一点。该死的一个愚蠢的错误。。我想我有点邋遢了。非常感谢,伙计。我经常使用Wireshark只是为了看看我的程序在网络上做什么。通常我比任何论坛都能更快地得到更好的答案。也许您可以这样做。请注意,len也是一个inout参数。可能需要重新初始化。@david.pfx是的,当您重新初始化它时,这是一种很好的风格。但是,当前使用的变量总是导致中的sizeofsockaddr_值。因此,它在代码摘录中起作用。代码中还有其他问题,如setsockopt参数中的奇怪值“a”、无法停止任何线程、getDate和getTime中未使用的变量a。但是这些都与问题无关。感谢你的建议,我清理了未使用的变量,现在我已经解决了主要问题,我已经意识到了它们。关于线程,它们不是在主线程完成后就消失了吗?在这种情况下,我真的不需要在我的子线程上“安全关闭”。这被认为是不好的做法吗?我应该在父线程完成之前手动杀死线程吗?该死的错误。。我想我有点邋遢了。非常感谢,伙计。我经常使用Wireshark只是为了看看我的程序在网络上做什么。通常我比任何论坛都能更快地得到更好的答案。也许您可以这样做。请注意,len也是一个inout参数。可能需要重新初始化。@david.pfx是的,当您重新初始化它时,这是一种很好的风格。但是,当前使用的变量总是导致中的sizeofsockaddr_值。因此,它在代码摘录中起作用。代码中还有其他问题,如setsockopt参数中的奇怪值“a”、无法停止任何线程、getDate和getTime中未使用的变量a。但是这些都与问题无关。感谢你的建议,我清理了未使用的变量,现在我已经解决了主要问题,我已经意识到了它们。关于线程,它们不是在主线程完成后就消失了吗?在这种情况下,我真的不需要在我的子线程上“安全关闭”。这被认为是不好的做法吗?我应该在父线程完成之前手动终止线程吗?