devc++ 使用 winsock 实现 UDP 广播

2024-02-18 15:04

本文主要是介绍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;  
} 

这篇关于devc++ 使用 winsock 实现 UDP 广播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721545

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se