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() {
	// 初始化Winsock
	WSADATA 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() {

	// 初始化Winsock
	WSADATA 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试系列 之 Python单元测试框架unittest

一、概述 什么是单元测试 单元测试是一种软件测试方法&#xff0c;是测试最小的可测试单元&#xff0c;通常是一个函数或一个方法。 在软件开发过程中&#xff0c;单元测试作为一项重要的测试方法被广泛应用。 为什么需要单元测试 单元测试是软件开发中重要的一环&#xf…

微服务系列之分布式事务理论

概述 事务是由一组操作构成的可靠的独立的工作单元&#xff0c;事务具备ACID的特性&#xff0c;即原子性、一致性、隔离性和持久性。 分类 大多数情况下&#xff0c;分类是没有意义的一件事。但是分类可以一定程度上&#xff0c;加深理解。 实现 从实现角度来看&#xff0…

c语言函数篇——递归函数

递归函数的工作原理 递归函数的工作原理基于两个主要部分&#xff1a;基本情况和递归情况。基本情况是函数不再调用自身的条件&#xff0c;当达到基本情况时&#xff0c;递归停止并返回结果。递归情况是函数调用自身的部分&#xff0c;它将问题分解为更小的、相似的子问题。 …

【Matlab】基于遗传算法优化BP神经网络 (GA-BP)的数据时序预测

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88682033 一&#xff0c;概述 基于遗传算法优化BP神经网络 (GA-BP) 的数据时序预测是一种常用的机器学习方法&#xff0c;用于预测时间序列数据的趋势和未来值。 在使用这种方法之前&#xff0c;需要将时间序…

微信小程序开发系列-07组件

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

【FileZilla】的基本使用

一、FileZilla的使用 1.1 FileZilla简介 1.2 软件下载 到官方网站下载 FileZilla 的服务端和客户端程序 FileZilla - The free FTP solution 自行下载即可 1.3 软件安装 &#xff08;1&#xff09;先安装服务端【傻瓜式安装】&#xff0c;一直下一步下一步安装即可 &#xf…

uniapp中组件库的丰富NumberBox 步进器的用法

目录 基本使用 #步长设置 #限制输入范围 #限制只能输入整数 #禁用 #固定小数位数 #异步变更 #自定义颜色和大小 #自定义 slot API #Props #Events #Slots 基本使用 通过v-model绑定value初始值&#xff0c;此值是双向绑定的&#xff0c;无需在回调中将返回的数值重…

【linux】head的用法 输出文件开头的内容

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…

SpringMVC源码解析——DispatcherServlet初始化

在Spring中&#xff0c;ContextLoaderListener只是辅助功能&#xff0c;用于创建WebApplicationContext类型的实例&#xff0c;而真正的逻辑实现其实是在DispatcherServlet中进行的&#xff0c;DispatcherServlet是实现Servlet接口的实现类。Servlet是一个JAVA编写的程序&#…

STM32——F407定时器概述

1 定时器分类 定时器类型数量位号位宽时钟捕获/比较输出DMA请求计数互补输出基本2TIM6,TIM716bitAPB1-有递增-通用2TIM2,TIM532bitAPB14通道有递增、递减、中心对齐-通用2TIM3,TIM432bitAPB14通道有递增、递减、中心对齐-通用1TIM916bitAPB14通道有递增-通用2TIM10、TIM1116bi…

图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 上篇内容&#xff1a; Unet系列算法 下篇内容&#xff1a; unet医学细胞分割实战2 1、医学细胞数据…

STM32——通用计时器

通用计时器框图 1.时钟源 1&#xff09;内部时钟(CK_INT) 2&#xff09;外部时钟模式 1&#xff1a;外部输入引脚(TIx)&#xff0c;x1&#xff0c;2&#xff08;即只能来自于通道 1 或者通道 2&#xff09; 3&#xff09;外部时钟模式 2&#xff1a;外部触发输入(ETR) 4&#…

androidStudio 没有新建flutter工程的入口?

装了flutter dart 插件 执行了 flutter doctor 也执行了 flutter doctor --android-license 最后重启了 androidStudio 还是没发现在哪新建flutter项目工程 原来 plugins 下的 Android APK Support没有勾选

[C#]C# winform实现imagecaption图像生成描述图文描述生成

介绍&#xff1a; 地址&#xff1a;C#https://github.com/ruotianluo/ImageCaptioning.pytorch 效果&#xff1a; 测试环境&#xff1a; vs2019 onnxruntime1.16.3 opencvsharp4.8 代码&#xff1a; using System; using System.Collections.Generic; using System.Comp…

win11出现安全中心空白和IT管理员已限制对某些区域的访问(不一样的解决方式),真实的个人经历,并且解决经过

1、个人的产生问题的经历 2023年12月22日&#xff0c;由于我买了一块电脑的固态硬盘1T&#xff0c;想要扩容&#xff0c;原来电脑自带512G(由于个人是一个程序员&#xff0c;导致512G实在太古鸡肋)装好以后&#xff0c;想要重装一下系统&#xff0c;来个大清理。结果不出意料&…

二叉树BFS

前置知识 二叉树节点的定义 二叉树是递归定义的 /*** Definition for a binary tree node.&#xff08;LeetCode&#xff09;*/public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode…

自然语言处理2——轻松入门情感分析 - Python实战指南

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

小程序面试题 | 17.精选小程序面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

[Angular] 笔记 24:ngContainer vs. ngTemplate vs. ngContent

请说明 Angular 中 ngContainer&#xff0c; ngTemplate 和 ngContent 这三者之间的区别。 chatgpt 回答&#xff1a; 这三个在 Angular 中的概念是关于处理和组织视图的。 1. ngContainer&#xff1a; ngContainer 是一个虚拟的 HTML 容器&#xff0c;它本身不会在最终渲染…

算法训练day53|动态规划part14

参考&#xff1a;代码随想录 1143.最长公共子序列 重点&#xff1a;状态的转移与递推公式的确定 本题和动态规划&#xff1a;718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;"ace" 是 …