devc++ 使用 winsock 实现 UDP 局域网 WIFI 广播

参考链接

使用UDP发送广播报_udp广播 inaddr_broadcast-CSDN博客

UDP接收端收不到广播的消息问题排查_unity upd广播连接不上是什么情况-CSDN博客

 如何禁用自己电脑的虚拟网卡-百度经验 (baidu.com)

但是wifi 会屏蔽255.255.255.255 广播地址,所以 255.255.255.255 需要借助手机 wifi 路由实现真正局域网内广播,两台电脑连上同一个手机热点后,就可以发消息了。

一般的局域网游戏需要 UDP 广播,然后获取到 IP 才能定向发送消息。

而广播 UDP 的方法和 UDP 定向发送的 方法有些出入,这里是 移植到 DEVC++ 的 UDP 局域网广播方法。

参考第二条连接,在两台电脑连上同一个手机热点后,如果 UDP 还收不到消息:

同一个交换机下 是可以收到广播的 还有就是
电脑的虚拟网卡会拦截广播操作,因为你没有指定一个地址,所以代码正确的情况下,发送不出去或者接收不到,只需要考虑以下两种情况。
1.广播端虚拟网卡没有禁用
2.接收端虚拟网卡没有禁用

PS.虚拟网卡一般是装了虚拟机才会有的。

服务端

// 服务器端
// Server.cpp : Defines the entry point for the console application.
//
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable : 4996)
const int MAX_BUF_LEN = 255;int main(int argc, CHAR* argv[])
{WORD wVersionRequested;WSADATA wsaData;int err;// 启动socket apiwVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return -1;}if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ){WSACleanup( );return -1;}// 创建socketSOCKET connect_socket;connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(INVALID_SOCKET == connect_socket){err = WSAGetLastError();printf("/""socket/"" error! error code is %d/n", err);return -1;}SOCKADDR_IN sin;sin.sin_family = AF_INET;sin.sin_port = htons(3779);sin.sin_addr.s_addr = INADDR_BROADCAST;					// 255.255.255.255 但是会被路由器屏蔽,不过借用手机热点可以广播,只要两个电脑连同一个手机热点就能广播 bool bOpt = true;//设置该套接字为广播类型setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));int nAddrLen = sizeof(SOCKADDR);char buff[MAX_BUF_LEN] = "";int nLoop = 0;while(1){nLoop++;sprintf(buff, "%8d", nLoop);// 发送数据int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen);if(SOCKET_ERROR == nSendSize){err = WSAGetLastError();printf("/""sendto/"" error!, error code is %d/n", err);return -1;}printf("Send: %s/n", buff);Sleep(500);}return 0;
}

客户端

// 客户端  
// Client.cpp : Defines the entry point for the console application.  
//  
#include <WinSock2.h>  
#include <stdio.h>  
#pragma comment(lib, "ws2_32.lib")  #pragma warning(disable : 4996)
const int MAX_BUF_LEN = 255;  int main(int argc, CHAR* argv[])  
{  WORD wVersionRequested;  WSADATA wsaData;  int err;  // 启动socket api  wVersionRequested = MAKEWORD( 2, 2 );  err = WSAStartup( wVersionRequested, &wsaData );  if ( err != 0 )  {  return -1;  }  if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )  {  WSACleanup( );  return -1;   }  // 创建socket  SOCKET connect_socket;  connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  if(INVALID_SOCKET == connect_socket)  {  err = WSAGetLastError();  printf("/""socket/"" error! error code is %d/n", err);  return -1;  }  // 用来绑定套接字  SOCKADDR_IN sin;  sin.sin_family = AF_INET;  sin.sin_port = htons(3779);  sin.sin_addr.s_addr = 0;  		// 用来从网络上的广播地址接收数据  SOCKADDR_IN sin_from;  sin_from.sin_family = AF_INET;  sin_from.sin_port = htons(3779);  					// 端口和服务端一致 sin_from.sin_addr.s_addr = INADDR_ANY;  			// 接收全部广播 //设置该套接字为广播类型,  bool bOpt = true;  setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  // 绑定套接字  err = bind(connect_socket, (SOCKADDR*)&sin, sizeof(SOCKADDR));  if(SOCKET_ERROR == err)  {  err = WSAGetLastError();  printf("/""bind/"" error! error code is %d/n", err);  return -1;  }  int nAddrLen = sizeof(SOCKADDR);  char buff[MAX_BUF_LEN] = "";  while(1)  {  // 接收数据  int nSendSize = recvfrom(connect_socket, buff, MAX_BUF_LEN, 0, (SOCKADDR*)&sin_from, &nAddrLen);  if(SOCKET_ERROR == nSendSize)  {  err = WSAGetLastError();  printf("/""recvfrom/"" error! error code is %d/n", err);  return -1;  }  buff[nSendSize] = '/0';  printf("Recv: %s/n", buff);  }  return 0;  
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USART(串口发送接受单字节)

一、硬件 差分信号不需要太大的压差。在相同的电磁干扰的环境下&#xff0c;因为是双扭线&#xff0c;两根线受干扰的程度是一样的&#xff0c;所以压差相对不变。提高抗干扰能力。485是双绞线传输取的是两线的压差。一般来说受干扰后同步变化&#xff0c;比如都升0.5V或都降5…

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日&#xff0c;PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产&#xff0c;澳大利亚金融服务牌照遭暂停》&#xff0c;这也就意味着&#xff0c;PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是&#xff0c;时至今日…

k8s组件证书续期

K8S 各个组件需要与 api-server 进行通信,通信使用的证书都存放在 /etc/kubernetes/pki 路径下,由 kubeadm 生成的客户端证书在 1 年后到期,因此需要定时更新证书,否则证书到期会导致整个集群不可用。 证书过期后,执行kubectl命令会报如下错误: [root@k8s-master65 ~]#…

【Spring连载】使用Spring Data访问 MongoDB(四)----对象映射Object Mapping

【Spring连载】使用Spring Data访问 MongoDB&#xff08;四&#xff09;----对象映射Object Mapping 一、JSON Schema二、基于类型的转换器三、属性转换器四、非包装类型五、对象引用5.1 使用DBRefs 六、创建索引 一、JSON Schema 二、基于类型的转换器 三、属性转换器 四、…

Python实现线性逻辑回归和非线性逻辑回归

线性逻辑回归 # -*- coding: utf-8 -*- """ Created on 2024.2.20author: rubyw """import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import classification_report from sklearn import preprocessing from sklearn…

【51单片机】利用【与或赋值法】优化【配置TMOD寄存器】

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 本文是YY入门【【51单片机】从零开始手把手带你【查手册】配置定时器&#xff0c;并完成小项目&#xff08;定时器&#xff06;中断的应用&#xff0…

Spring整合Junit4

1、整合的好处 好处1&#xff1a;不需要自己创建IOC容器对象了好处2&#xff1a;任何需要的bean都可以在测试类中直接享受自动装配 2、操作 ①加入依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4…

vmware升级处理vib包冲突的问题

一、问题截图 通过mgmt挂载iso: 通过vcenter升级的截图&#xff1a; 通过cli升级报错&#xff1a;二、解决办法 1、删除冲突的vib 2、重启后继续升级 三、解决步骤 1、查看那些vib冲突需要被清理 2、进行cli命令进行清理 esxcli software vib list | grep xxxx esxcli s…

hung task, soft lockup, hard lockup, workqueue stall

hung task&#xff0c;soft lockup&#xff0c;hard lockup&#xff0c;workqueue stall 是 linux 内核中的异常检测机制&#xff0c;这 4 个检测均是通过时间维度上的检测来判断异常。 在时间维度上的检测机制&#xff0c;有两个核心的点&#xff1a; &#xff08;1&#xff…

多个.C 文件关于全局变量如何使用

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Ts总结5、TypeScript 元组

一、概念、写法 1、元组:是Ts中特有的,表示成员类型是可以自由设置的数组,即数组的各个成员的类型可以不同 2、写法:元组的成员类型是写在方括号里面([number])。TypeScript 的区分方法就是,成员类型写在方括号里面的就是元组,写在外面的就是数组。 // 数组: let a…

新 Mac 使用指南

文章目录 1、安装软件2、修改启动台3、修改 iCloud 设置、同步数据4、管理文件夹5、管理侧边栏6、设置快捷键 更新版本出现问题&#xff08;有机会更新下问题和解决方式&#xff09;&#xff0c;重装 Sonoma&#xff0c;获得了一个新的 macOS。以新用户的视角来看&#xff0c;有…

sora生成高质量视频的原理

Sora是怎样生成视频的&#xff1f; 写在前面 Sora 是 OpenAI 在日前发布的超强视频生成 AI&#xff0c;旨在探索 AI 如何在理解真实世界运动和交互方面做得更好Sora目前无灰度体验 面临挑战 Sora面对的挑战就像是需要处理和理解来自世界各地、不同设备拍摄的数以百万计的图…

算法:有效的括号

算法&#xff1a;有效的括号 判断字符串是否为有效的括号 function isValidParentheses(s) {const stack [];const map {"(": ")","[": "]","{": "}"};for (let i 0; i < s.length; i) {if (s[i] "…

Google账号批量注册指南:如何防止多账号被封?

电子邮件地址对于在线帐户至关重要&#xff0c;但它们可能被滥用于发送垃圾邮件。因此Google使用先进的算法来检测可疑的注册和验证尝试&#xff0c;保护用户免受垃圾邮件和其他有害活动的侵害&#xff0c;所以如果需要批量注册多个Google帐户&#xff0c;需要做好账号防关联&a…

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

机器学习 day38(有放回抽样、随机森林算法、XGBoost)

有放回抽样 有放回抽样和无放回抽样的区别&#xff1a;有放回可以确保每轮抽取的结果不一定相同&#xff0c;无放回则每轮抽取的结果都相同 在猫狗的例子中&#xff0c;我们使用”有放回抽样“来抽取10个样本&#xff0c;并组合为一个与原始数据集不同的新数据集&#xff0c;虽…

MySQL运维实战(7)建立复制

引言 在构建数据库复制系统时&#xff0c;正确配置主库和备库是确保数据同步顺利进行的关键步骤。以下是建立复制的基本步骤&#xff0c;主要包括主库开启binlog的关键参数设置&#xff0c;创建主库复制账号以满足基本权限需求&#xff0c;备库参数配置和初始化的步骤。 1、主…

git push 使用 --mirror 参数复制仓库

迁移一个 Git 仓库并且保留原有的提交记录和分支 克隆原始仓库到本地 git clone <原始仓库URL> <新仓库目录>添加新的远程仓库&#xff1a;git remote add new-origin <新仓库URL>推送所有分支和标签到新的远程仓库&#xff1a;git push new-origin --mirro…