当前位置: 首页 > news >正文

devc++ 使用 winsock 实现 UDP 广播

参考链接

使用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;  
} 

相关文章:

  • Rust 初体验6
  • phpstrom创建thinkphp项目
  • 【Webpack】处理 js 资源
  • C++运算符重载(日期类的运算符重载为例)
  • js---webAPI
  • 原型设计模式
  • 工作心得——css让元素居中的方法
  • 嵌入式linux驱动开发篇之设备树
  • php 数组函数
  • 关于jupyter的一些小笔记
  • Linux第48步_编译正点原子的出厂Linux内核源码
  • 【精选】Java面向对象进阶——接口细节:成员特点和接口的各种关系
  • 随想录刷题笔记 —二叉树篇7 617合并二叉树 700二叉搜索树中的搜索 98验证二叉搜索树
  • C++数据结构与算法——双指针法
  • python-使用ffmpeg批量修改文件的后缀名
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • C语言笔记(第一章:C语言编程)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • js
  • Js基础——数据类型之Null和Undefined
  • node 版本过低
  • PAT A1050
  • Python爬虫--- 1.3 BS4库的解析器
  • RxJS: 简单入门
  • SpringBoot几种定时任务的实现方式
  • Terraform入门 - 3. 变更基础设施
  • 半理解系列--Promise的进化史
  • 从PHP迁移至Golang - 基础篇
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何进阶一名有竞争力的程序员?
  • 通过npm或yarn自动生成vue组件
  • 一道闭包题引发的思考
  • 怎么把视频里的音乐提取出来
  • 进程与线程(三)——进程/线程间通信
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #、%和$符号在OGNL表达式中经常出现
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)STL算法之搜索
  • (C#)一个最简单的链表类
  • (C语言)球球大作战
  • (pytorch进阶之路)扩散概率模型
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (正则)提取页面里的img标签
  • (转)iOS字体
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net MVC中使用angularJs刷新页面数据列表