🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于分享知识,欢迎大家共同学习和交流。
广播分为两种,直接广播和有限广播,
直接广播
在某个网段内发送数据可以跨路由器,通过直接广播,就是将这个网段的网络号不变,主机号变为全1,即x.x.x.255
例如广播地址是192.168.3.255,那么网段为192.168.3.xxx的所有主机都会收到。
将UDP协议的服务端和客户端代码进行稍微修改,可以实现广播。
将客户端中目的主机的IP修改为192.168.3.255,这样就是所有网段为192.168.3.xxx的主机均可以收到。
将客户端的接收代码注释,并且将服务端的发送代码注释掉
sockaddr_in sockServer;
sockServer.sin_family = AF_INET;
//sockServer.sin_port = htons(9876); //设置端口号
//sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.186");
sockServer.sin_port = htons(98765); //设置端口号
sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.255");
char recvBuf[4096] = "";
char sendBuf[4096] = "";
int recv = 0;
int send = 0;
cout << "-----Client init over-----" << endl;
while (true)
{
//5、发送数据
cout << "Client send: ";
gets_s(sendBuf);
send=sendto(sock, sendBuf, sizeof(sendBuf), 0, (sockaddr*)&sockServer, sizeof(sockServer));
if (SOCKET_ERROR == send) {
cout << "sendto fail" << endl;
}
}
实现结果如图所示:
有限广播
有限广播是向局域网中任意网段发送数据,发送地址是255.255.255.255,不能跨路由器进行。
有限广播需要设置一个广播权限,使用setsockopt函数。函数的返回值是0或者SOCKET_ERROR,若返回0说明正常设置权限。
int WSAAPI setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
第一个参数是需要设置权限的套接字;第二个参数是定义选项的级别,填写SOL_SOCKET;第三个参数的选项名称,要设置广播就填写SO_BROADCAST;第四个参数是指向指定请求选项值的缓冲区的指针,是给广播权限设置的数值,TRUE是设置广播权限,FALSE是取消广播权限;第五个参数是指向缓冲区的大小,也就是第四个参数的大小。
对客户端代码进行修改:
//设置有限广播权限
BOOL bval = TRUE;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bval, sizeof(bval));
sockaddr_in sockServer;
sockServer.sin_family = AF_INET;
//sockServer.sin_port = htons(9876); //设置端口号
//sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.186"); //直接广播
sockServer.sin_port = htons(98765); //设置端口号
sockServer.sin_addr.S_un.S_addr = inet_addr("255.255.255.255"); //有限广播
char recvBuf[4096] = "";
char sendBuf[4096] = "";
int recv = 0;
int send = 0;
cout << "-----Client init over-----" << endl;
while (true)
{
//5、发送数据
cout << "Client send: ";
gets_s(sendBuf);
send=sendto(sock, sendBuf, sizeof(sendBuf), 0, (sockaddr*)&sockServer, sizeof(sockServer));
if (SOCKET_ERROR == send) {
cout << "sendto fail" << endl;
}
}
可以达到相同的效果。