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

UDP信号多个电脑的信息传输测试、配置指南

最近要做一个东西,关于一个软件上得到的信号,如何通过连接的局域网,将数据传输出去。我没做过相关的东西,但是我想应该和软件连接数据库的过程大致是差不多的,就一个ip和一个端口号啥的。

一.问题思路

多个设备同时连接同一个局域网,在一个电脑上发送一个数据,在别的电脑上可以实时接收这个数据。在找工作面试的时候,提前背了相关TCP、UDP的特性,由于TCP是面向连接的,虽然传输数据是可靠的,但是速率是比UDP慢的。因此,我想了想使用UDP传输是比较合适的,这个地方要用到Socket编程。当时面试只是背了背什么C++版本的Socket编程,其大致和java之中的Socket类似,但是还没有用过,趁着这个机会学一下。

二.ip设置与端口的设置

首先,查看本机ip。

按下windows键 + r ,打开运行,输入cmd。

在运行框里输入ipconfig(都是基本操作),查看ip地址。

可以看到我的接收端的ip地址是192.168.1.144.

我现在自己的电脑上进行试一下。

接收端代码:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")int main() {// 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cout << "初始化套接字" << std::endl;return -1;}// 创建套接字SOCKET receiverSocket = socket(AF_INET, SOCK_DGRAM, 0);if (receiverSocket == INVALID_SOCKET) {std::cout << "创建套接字失败" << std::endl;WSACleanup();return -1;}// 绑定监听地址sockaddr_in receiverAddress;receiverAddress.sin_family = AF_INET;receiverAddress.sin_port = htons(1234);  // 设置监听端口号receiverAddress.sin_addr.s_addr = INADDR_ANY;if (bind(receiverSocket, (sockaddr*)&receiverAddress, sizeof(receiverAddress)) == SOCKET_ERROR) {std::cout << "绑定套接字失败" << std::endl;closesocket(receiverSocket);WSACleanup();return -1;}// 接收数据char buffer[1024];sockaddr_in senderAddress;int senderAddressSize = sizeof(senderAddress);int receivedBytes = recvfrom(receiverSocket, buffer, sizeof(buffer), 0, (sockaddr*)&senderAddress, &senderAddressSize);if (receivedBytes == SOCKET_ERROR) {std::cout << "接收数据失败" << std::endl;}else {buffer[receivedBytes] = '\0';std::cout << "接收到的数据: " << buffer << std::endl;}// 清理资源closesocket(receiverSocket);WSACleanup();getchar();return 0;
}

发送端代码:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")int main() {// 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cout << "初始化Socket失败" << std::endl;return -1;}// 创建套接字SOCKET senderSocket = socket(AF_INET, SOCK_DGRAM, 0);if (senderSocket == INVALID_SOCKET) {std::cout << "创建Socket失败" << std::endl;WSACleanup();return -1;}// 设置接收方地址sockaddr_in receiverAddress;receiverAddress.sin_family = AF_INET;receiverAddress.sin_port = htons(1234);  // 设置接收方的监听端口号receiverAddress.sin_addr.s_addr = inet_addr("192.168.1.144");// 发送数据const char* message = "你好呀!小杨同学";if (sendto(senderSocket, message, strlen(message), 0, (sockaddr*)&receiverAddress, sizeof(receiverAddress)) == SOCKET_ERROR) {std::cout << "发送数据失败" << std::endl;}else {std::cout << "成功发送数据" << std::endl;}// 清理资源closesocket(senderSocket);WSACleanup();return 0;
}

最终的结果,可以看到两台电脑正常通信:

三.问题的出现

一台机器上进行通信是完全没有问题的,但是当两台机器进行通信的时候,其中一台给另外一台发送消息,是正常的,但是当反过来的时候发现通信不了。

我的防火墙已经关闭了,应该没啥问题哈,直接ping一下看看

但是ping了一下发现可以ping通呀。

四.问题的解决

解决方案一:防火墙关闭---端口

接下来去看一下相应的端口状态:使用windows + r,打开任务管理器 -> 性能

性能 -> 打开资源监视器

查看端口的权限情况

可以发现我的监听端口一栏之中,UDP完全是不允许的。

那就继续深究一下端口的问题,发现前面的那个防火墙状态只是用来防病毒的,并不是用来监视端口的。首先打开控制面板

启用或者关闭防火墙

关闭防火墙

发现还是不可以。

查看端口信息,可以看到1235端口并没有指定IPv4。

那么我们需要给1235端口号指定一个IPv4的地址。

这个地方我就直接将端口号改为了本机端口:

发现偶尔可以接收到消息,有的时候还是接收不到消息。

解决方案二:多次传输

想一下UDP的传输协议,这是不可靠的传输协议,因此,重新修改代码,发现与上面那个地址是否绑定无关。

接收端:我将信号变为一直接收的状态

while (1){// 接收数据char buffer[1024];sockaddr_in senderAddress;int senderAddressSize = sizeof(senderAddress);int receivedBytes = recvfrom(receiverSocket, buffer, sizeof(buffer), 0, (sockaddr*)&senderAddress, &senderAddressSize);if (receivedBytes == SOCKET_ERROR) {std::cout << "接收数据失败" << std::endl;}else {buffer[receivedBytes] = '\0';std::cout << "接收到的数据: " << buffer << std::endl;}}

发送端:将信号发送10次。

// 发送数据const char* message = "你好呀!小杨同学";for (int i = 0; i < 10; i++){if (sendto(senderSocket, message, strlen(message), 0, (sockaddr*)&receiverAddress, sizeof(receiverAddress)) == SOCKET_ERROR) {std::cout << "发送数据失败" << std::endl;}else {std::cout << "成功发送数据" << std::endl;}}

结果:发送了10次数据,只接收到了八个数据。

通过上述数据说明,在进行使用的过程之中,既然寻求速度选择了UDP发送数据,第一个注意点是需要将防火墙进行关闭。第二个注意点是注意数据的丢失情况,只进行发送一次可能出现发送不成功的问题。

补充解决方案三:方案一的替代版

一般而言,电脑上的防火墙是不允许关闭的,因此,有没有什么更好的方案去替代方案一。

将防火墙进行打开, 防火墙 -> 高级设置

入站规则 -> 新建规则

端口

只允许连接

随便起个名字

可以看到也是正常使用的。

五.界面设计

(1)发送端

其中,三个输入框之中的变量绑定分别为

CIPAddressCtrl m_ip; // ip
CEdit m_port;        // 端口号
CEdit m_edit;        // 发送数据

将中间的最大的发送数据的编辑框设置属性

需要注意在相应的属性设置栏之中,不使用预编译头文件,否则会与C6990错误产生冲突。

发送端代码进行测试:

可以发现是能够进行正常的使用的。

(2)接收端

接收端的代码就不详细解释了,详细的资源可以在博客之中进行下载。

最终的测试界面是正确的。

代码下载地址:

https://download.csdn.net/download/m0_47489229/88671248icon-default.png?t=N7T8https://download.csdn.net/download/m0_47489229/88671248

相关文章:

UDP信号多个电脑的信息传输测试、配置指南

最近要做一个东西&#xff0c;关于一个软件上得到的信号&#xff0c;如何通过连接的局域网&#xff0c;将数据传输出去。我没做过相关的东西&#xff0c;但是我想应该和软件连接数据库的过程大致是差不多的&#xff0c;就一个ip和一个端口号啥的。 一.问题思路 多个设备同时连…...

先序+中序还原二叉树【数据结构】

先序中序还原二叉树 题目描述 给定一棵二叉树的先序遍历序列和中序遍历序列&#xff0c;要求计算该二叉树的高度。 输入 输入首先给出正整数N&#xff08;≤50&#xff09;&#xff0c;为树中结点总数。下面两行先后给出先序和中序遍历序列&#xff0c;均是长度为N的不包含重…...

【全网首发】洛谷P2678 [NOIP2015 提高组] 跳石头

Everyday English You don’t become what you want; you become whatyou believe. —Oprah Winfrey 你不是成为你想要的&#xff0c;你成为你所相信的。 洛谷P2678 [NOIP2015 提高组] 跳石头 题目描述 一年一度的“跳石头”比赛又要开始了&#xff01; 这项比赛将在一条笔…...

Gpt指引ubuntu安装java8/11

在Ubuntu系统上安装Java环境通常包括以下几个步骤&#xff1a; 更新软件包索引&#xff1a; 在安装新软件之前&#xff0c;最好先更新Ubuntu的软件包索引。这可以确保你安装的是最新版本的软件包。可以使用以下命令来更新&#xff1a; sudo apt update安装Java&#xff1a; U…...

【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程&#xff0c;主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分&#xff0c;帮助读者了解TC397芯片的时钟树结构&#xff0c;在后续计算配置不同外设模块诸如通信速率&#xff0c;定时器周期等&…...

最新AI系统ChatGPT网站H5系统源码,支持AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…...

如何在MAC OS中的XCODE下添加 <bits/stdc++.h>

mac上使用的编译器是Clang&#xff0c;但是没有万能头文件bits/stdc.h\&#xff0c;本文介绍如何添加万能头文件 Xcode 版本&#xff1a;15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…...

Maven项目提示Ignored pom.xml问题

1 环境 &#xff08;1&#xff09;IDEA开发工具&#xff1a;2022.2.1 &#xff08;2&#xff09;JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; &#xff08;3&#xff09;Spring&#xff1a;6.1.2 &#xff08;4&#xff09;Maven 3.8.8 2 …...

SQL学习汇总

数据库将两张没有关联的表进行横向连接数据库将两张表进行横向连接&#xff08;拼接成一张表的形式显示&#xff09;_db2 两条记录如果相同就横向显示-CSDN博客 mysql统计某个字段的比例_mysql查询一行某个字段占整个字段sum的比例-CSDN博客 Spark 系列&#xff08;十二&…...

单片机MCU堆栈概念与区别

C语言中的堆栈是用于存储函数调用、局部变量以及程序执行期间所需的临时数据的内存区域。堆栈由编译器自动管理&#xff0c;是一种后进先出&#xff08;LIFO&#xff09;的数据结构。堆栈空间大小指的是分配给堆栈的内存空间大小&#xff0c;它限制了函数调用和局部变量的深度和…...

C#中使用is关键字检查对象是否与给定类型兼容

目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换&#xff0c;如果类型转换不成功则会出现异常&#xff0c;从抛出异常到捕获并处理异常&#xff0c;无形中增加了系统的开销&#xff0c;而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…...

AI时代下,如何看待“算法利维坦”?

ChatGPT的浪潮从2022年袭来后&#xff0c;至今热度不减&#xff0c;呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术......AI真的已经走进了生活的方方面面&#xff0c;我们仿佛已经进入了AI时代&#xff0c;势不可挡。人工智能水平如此之高&#xff0c;不禁…...

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…...

直方图与均衡化

直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images&#xff1a;原图像图像格式为uint8或float32&#xff0c;当传入函数时应用[]括起来&#xff0c;例如[img]。 channels&#xff1a;同样用中括号括起来&#xff…...

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…...

PiflowX组件-ReadFromKafka

ReadFromKafka组件 组件说明 从kafka中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号分隔的Ka…...

Ubuntu 安装MySQL以及基本使用

前言 MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux&#xff0c;Apache&#xff0c;MySQL&#xff0c;PHP / Python / Perl&#xff09;堆栈的一部分安装。它使用关系数据库和SQL&#xff08;结构化查询语言&#xff09;来管理其数据。 安装…...

基于Freeswitch实现的Volte网视频通知应用

现在运营商的Volte网络已经很好的支持视频通话了&#xff0c;因此在原来的电话语音通知的基础上&#xff0c;可以更进一步实现视频的通知&#xff0c;让用户有更好的体验&#xff0c;本文就从技术角度&#xff0c;基于Freeswitch来实现此类应用&#xff08;本文假设读者已对Fre…...

怎么实现Servlet的自动加载

在实际开发时&#xff0c;有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。但在默认情况下&#xff0c;第一次访问servlet的时候&#xff0c;才创建servlet对象。 如果servlet构造函数里面的代码或者init方法里面的代码比较多&#xff0c;就会导致用户第一次访问serv…...

15. Mysql 变量的使用

目录 变量的概述自定义变量系统变量查看系统变量系统变量赋值 局部变量总结参考资料 变量的概述 MySQL支持不同类型的变量&#xff0c;包括自定义变量、系统变量和局部变量。自定义变量是在会话中定义的变量&#xff0c;用于存储临时数据。系统变量是MySQL服务器提供的全局变量…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...