发送广播 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
来存储发件人地址。因此,发送函数中的目标地址会受到损害。
笔记本电脑的网卡地址存储在该变量中。这就是您停止发送广播的原因。
相关文章:
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- WinSock Non-Blocking I/O
- 使用 winsock 接收 http 请求
- 如何查找 winsock.h 在 Visual Studio 中的包含位置
- 在Linux上交叉编译Windows应用程序时如何链接到Winsock?
- C++低吞吐量 winsock TCP 测试应用程序
- Winsock 数据不是从 IP 检索的,而是从普通 URL 检索的
- 错误:10035 Winsock发送
- 如何使用c++在winsock中从客户端向服务器发送大字符串
- 如何使用winsock在c++应用程序中实现安全套接字通信
- 如何为winsock的send()函数构造constchar*缓冲区
- C++WinSock选择本地接口进行连接
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- 使用 WinSock 处理多个用户
- Winsock本地客户服务器基准测试
- WinSock c++ inet_ntop始终显示 204.204.204.204(并且 accept() 没有失败)
- Winsock错误10022在听
- 致命错误:Winsock:没有这样的文件或目录
- 如何通过TCP/IP Winsock发送双型数据
- Winsock 400 错误请求,开放性