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

news2024/11/18 15:37:34

最近要做一个东西,关于一个软件上得到的信号,如何通过连接的局域网,将数据传输出去。我没做过相关的东西,但是我想应该和软件连接数据库的过程大致是差不多的,就一个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发送数据,第一个注意点是需要将防火墙进行关闭。第二个注意点是注意数据的丢失情况,只进行发送一次可能出现发送不成功的问题。

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

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

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

入站规则 -> 新建规则

端口

只允许连接

随便起个名字

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

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

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

相关文章

释放创造力的终极工具——Adobe Photoshop 2022 Mac/win

作为全球最受欢迎的图像处理软件&#xff0c;Adobe Photoshop一直是专业设计师和摄影师的首选工具。而最新推出的Adobe Photoshop 2022更是在功能和性能上迈出了重要的一步&#xff0c;为用户提供了更强大、更便捷的创作体验。 首先&#xff0c;Adobe Photoshop 2022引入了许多…

html table可编辑表格数据实现删除

这里教大家使用纯html和js脚本结合实现删除表格数据 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align: left;}</style> </head> <body…

5G阅信应用场景有哪些?

5G阅信的应用场景非常广泛&#xff0c;以下是一些常见的应用场景&#xff1a; 1.工业自动化&#xff1a;5G阅信可以连接各种工业设备和传感器&#xff0c;实现设备之间的实时通信和控制&#xff0c;提高生产效率和自动化水平。 2.物联网和智能家居&#xff1a;5G阅信可以连接各…

【每日一题】LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

文件夹改名方法:文件夹随机重命名的实用技巧,轻松管理

在日常生活和工作中&#xff0c;会遇到大量的文件夹要处理和管理。方便查找或分类&#xff0c;要对文件夹进行重命名。如果手动一个个重命名不仅耗时&#xff0c;还容易出错。现在一起来看看云炫文件管理器如何批量随机重命名文件夹&#xff0c;掌握这些技巧能更加轻松地应对工…

idea自动注释

前言 保存一下自己的自动注释代码 idea自动注释 前言1 创建类时&#xff0c;自动生成注释2 在方法上使用快捷键生成注释3 使用方法4 效果图 1 创建类时&#xff0c;自动生成注释 如下&#xff1a; #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package …

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次&#xff0c;大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…

【Python终端报错】“python.exe: can‘t open file”【及解决方法】

一、问题描述 如下图&#xff0c;在PyCharm中使用自带的Python终端运行源代码文件时&#xff0c;提示出错&#xff1a; D:\Program Files\Python3.10.0\python.exe: can’t open file ‘D:\Desktop\Python Security Chapter 4\Whois’: [Errno 2] No such file or directory 翻…

Winserver上如何配置和开启NTP客户端进行时间同步

场景 Winserver 2012 服务器&#xff0c;需要与其它服务器保持时间一致。 已知NTP服务器的ip,在winserver 服务器上如何进行配置和开启。 注&#xff1a; 博客&#xff1a;霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客 实现 1、运行-输入 gpedit.msc 打开组策略管理器…

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

c++学习笔记(13)-左值和右值

一、左值与右值 啥是左值和右值呢&#xff1f; 左值&#xff1a;在内存有确定存储地址、有变量名&#xff0c;表达式结束依然存在的值&#xff0c;简单来说左值就是非临时对象。 右值&#xff1a;就是在内存没有确定存储地址、没有变量名&#xff0c;表达式结束就会销毁的值&…

1764程控直流电源

1764程控直流电源 交流输入电压范围&#xff1a;100&#xff5e;242Vac 在自动测试环境中提供偏置和对部件或最终产品提供激励的理想设备 国产思仪电源 01 产品综述 1764程控直流电源是在自动测试环境中提供偏置和对部件或最终产品提供激励的理想设备。其广泛应用于民用测…

无线路由器DHCP导致网络故障一例

多个DHCP故障 这几天公司网络很难用&#xff0c;也不知道原因。通过路由器的检测功能&#xff0c;领导截图如下&#xff1a; 故障解决 其实解决办法也很简单&#xff0c;就是关闭设备排查。结果发现是一个无线路由器导致的。进入路由器管理界面&#xff0c;关闭DHCP即可。 反思…

SAP PP BAPI 成本收集器的操作

成本收集器常见用tcode:KKF6n 删除标记也是在这里操作 那业务提出批量打删除标记的事务代码却是没有&#xff0c;预研一下 SAP 关于成本收集器的BAPI KOSA KK_F_PKOSA_AUTHORITY KK_F_PKOSA_COPY KK_F_PKOSA_CREATE KK_F_PKOSA_DISPLAY KK_F_PKOSA_FILL KK_F_PKOSA_FIND KK…

华为——使用ACL限制内网主机访问外网网站示例

组网图形 图1 使用ACL限制内网主机访问外网网站示例 ACL简介配置注意事项组网需求配置思路操作步骤配置文件 ACL简介 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#…

如何使用iframe嵌套跨域类型的网址?

本章教程&#xff0c;主要介绍一下&#xff0c;如何利用iframe嵌套一些存在跨域性的问题。 这里我们以百度首页网址进行举例说明。 如果我们直接嵌套百度的首页地址&#xff0c;如下 <!DOCTYPE html> <html lang"en"><head><meta charset"…

基于 OV2640 的以太网 RGMII 图像传输系统设计

相关文章: (1)千兆以太网网络层 ARP 协议的原理与 FPGA 实现 (2)千兆以太网硬件设计及链路层 MAC 协议格式 (3)CRC校验原理及实现 (4)RGMII 与 GMII 转换电路设计 (5)千兆以太网网络层 IP 协议介绍与 IP 校 验和算法实现 (6)千兆以太网传输层 UDP 协议原理与 FPGA…

楼宇对讲门铃的芯片选型分析

目前很多的高层住宅都使用了对讲门铃了&#xff0c;在频繁使用中&#xff0c;门铃会出现的越来越多种类&#xff0c;下面我就简单的介绍会有用到的几款芯片. 语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器…

Postman接口测试(附教程)

前言 之前还没实际做过接口测试的时候呢&#xff0c;对接口测试这个概念比较渺茫&#xff0c;只能靠百度&#xff0c;查看各种接口实例&#xff0c;然后在工作中也没用上&#xff0c;现在呢是各种各样的接口都丢过来…

C++力扣题目347--前k个高频元素

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 < nums.length < 105k 的取…