VSUDP通信

2023-05-16

好久没弄VS的UDP通信了,使用方式都忘记的差不多了。今天遇到了正好学习一下。

UDP理论:

UDP参考链接:

socket函数

为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

 #include <sys/socket.h>
 int socket(int family,int type,int protocol);    
      返回:非负描述字---成功   -1---失败
  • 第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);
  • 第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);
  • 如果套接口类型不是原始套接口,那么第三个参数就为0。
bind函数

为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。

#include <sys/socket.h>  
 int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen);
 返回:0---成功   -1---失败 
  • 第一个参数是socket函数返回的套接口描述字;
  • 第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。
recvfrom函数

UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是在recvfrom()函数中要指明目的地址。

#include <sys/types.h>  
#include <sys/socket.h>  
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr * from, size_t *addrlen);
 返回接收到数据的长度---成功   -1---失败 
  • 前三个参数等同于函数read()的前三个参数
  • flags参数是传输控制标志。
  • 最后两个参数类似于accept的最后两个参数。
sendto函数

UDP使用sendto()函数发送数据,他类似于标准的write(),但是在sendto()函数中要指明目的地址。

#include <sys/types.h>  
#include <sys/socket.h>  
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr * to, int addrlen);
 返回发送数据的长度---成功   -1---失败 
  • 前三个参数等同于函数read()的前三个参数
  • flags参数是传输控制标志。
  • 参数to指明数据将发往的协议地址
  • 他的大小由addrlen参数来指定

文章转载:(博主写的已经很详细了,为了防止丢失在这边重新保存一遍)

UDP通信模型:
在这里插入图片描述

vs 实现udp通信

服务器端编程的步骤
  1. 创建套接字(socket)
  2. 将套接字和IP地址、端口号绑定在一起(bind)
  3. 等待客户端发起数据通信(recvfrom/recvto)
  4. 关闭套接字
客户端编程的步骤
  1. 创建套接字(socket)
  2. 向服务器发起通信(recvfrom/recvto)
  3. 关闭套接字
知识点:
在vs中一般使用Winsock2实现网络通信功能,所以需要引进头文件winsock2.h和库文件"ws2_32.lib"。
  • WinSock2 是连接系统和用户使用的软件之间用于交流的一个接口,这个功能就是修复软件与系统正确的通讯的作用。

  • Winsock2 SPI(Service Provider Interface)服务提供者接口建立在Windows开放系统架构WOSA(Windows Open System Architecture)之上,是Winsock系统组件提供的面向系统底层的编程接口。

  • Winsock系统组件向上面向用户应用程序提供一个标准的API接口;向下在Winsock组件和Winsock服务提供者(比如TCP/IP协议栈)之间提供一个标准的SPI接口。

  • 各种服务提供者是Windows支持的DLL,挂载在Winsock2 的Ws2_32.dll模块下。

  • 对用户应用程序使用的Winsock2 API中定义的许多内部函数来说,这些服务提供者都提供了它们的对应的运作方式(例如API函数WSAConnect有相应的SPI函数WSPConnect)。

  • 多数情况下,一个应用程序在调用Winsock2 API函数时,Ws2_32.dll会调用相应的Winsock2 SPI函数,利用特定的服务提供者执行所请求的服务。

pragma comment(lib,“Ws2_32.lib”)
作用:
  • 表示链接Ws2_32.lib这个库,和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了。
  • 告诉连接器连接的时候要找ws2_32.lib,这样你就不用在linker的lib设置里指定这个lib了。
  • ws2_32.lib是winsock2的库文件。
  • WinSock2就相当于连接系统和你使用的软件之间交流的一个接口,可能这个功能就是修复软件与系统正确的通讯的作用。
WASDATA
一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
结构原型: 
	typedef struct WSAData {
	        WORD                    wVersion;   
	        WORD                    wHighVersion;
	#ifdef _WIN64
	        unsigned short          iMaxSockets;
	        unsigned short          iMaxUdpDg;
	        char FAR *              lpVendorInfo;
	        char                    szDescription[WSADESCRIPTION_LEN+1];
	        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
	#else
	        char                    szDescription[WSADESCRIPTION_LEN+1];
	        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
	        unsigned short          iMaxSockets;
	        unsigned short          iMaxUdpDg;
	        char FAR *              lpVendorInfo;
	#endif
	} WSADATA,  FAR * LPWSADATA;

MAKEWORD(a, b):声明调用不同的Winsock版本
  • makeword是将两个byte型合并成一个word型,一个在高8位(b),一个在低8位(a)
  • 返回值:一个无符号16位整形数。
  • MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于:前者只能一次接收一次,不能马上发送,而后者能。
  • MAKEWORD(2,2)就是调用2.2版,MAKEWORD(1,1)就是调用1.1版。
  • 1.1版只支持TCP/IP协议,而2.0版可以支持多协议。
  • 2.0版有良好的向后兼容性,任何使用1.1版的源代码、二进制文件、应用程序都可以不加修改地在2.0规范下使用。
WSAStartup(sockVersion, &wsadata)
  • WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令。是Windows下的网络编程接口软件Winsock1 或 Winsock2 里面的一个命令。
  • WSAStartup必须是应用程序或DLL调用的第一个Windows Sockets函数。它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节。应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数。
sockaddr结构
 truct sockaddr
 {
      unsigned short    sa_family;             /*addressfamily,AF_xxx*/
      char              sa_data[14];           /*14bytesofprotocoladdress*/
 } ;
sa_family: 是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族。
sa_data:14字节协议地址。
  • 此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构(在WinSock2.h中定义)
	struct sockaddr_in {
		        short   sin_family;
		        u_short sin_port;
		        struct  in_addr sin_addr;
		        char    sin_zero[8];
	};
	sin_family指代协议族,在socket编程中只能是AF_INET
	sin_port存储端口号(使用网络字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。
	sin_addr存储IP地址,使用in_addr这个数据结构
	sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

  • sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,然后用memset函数初始化:
  • memset((char)&mysock,0,sizeof(mysock))

c_str

  • c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str())。
  • c_str()返回的是一个分配给const char的地址,其内容已设定为不可变更,如果再把此地址赋给一个可以变更内容的char变量,就会产生冲突。但是如果放入函数调用,或者直接输出,因为这些函数和输出都是把字符串指针作为 const char*引用的,所以不会有问题。
  • c_str() 以const char* 类型返回 string 内含的字符串。如果一个函数要求char*参数,可以使用c_str()方法:
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
  • c_str在打开文件时的用处:
    当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str());。其中st是string类型,存放的即为用户输入的文件名。

memset

  • void *memset(void *s, int ch, size_t n);
  • 将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
  • 在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。

recvfrom

recvfrom(
    _In_ SOCKET s,
    _Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf, //接收数据的缓冲区     
    _In_ int len,                                                                 //缓冲区的大小
    _In_ int flags,                                                               //标志位,调用操作方式
    _Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR * from,     //sockaddr结构地址
    _Inout_opt_ int FAR * fromlen                                                 //sockaddr结构大小地址
    );

sendto

	WSAAPI
	sendto(
	    _In_ SOCKET s,                                            //socket 
	    _In_reads_bytes_(len) const char FAR * buf,               //发送数据的缓冲区   
	    _In_ int len,                                             //缓冲区大小      
	    _In_ int flags,                                           //标志位,调用操作方式
	    _In_reads_bytes_(tolen) const struct sockaddr FAR * to,   //sockaddr结构地址
	    _In_ int tolen                                            //sockaddr结构大小地址
	    );
示例代码
  • 服务端
// server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <WinSock2.h>
#include<WS2tcpip.h>
#include<string>
#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() {
    //设置版本号
	WORD sockVersion = MAKEWORD(2, 2);
    //定义一个WSADATA类型的结构体,存储被WSAStartup函数调用后返回的Windows Sockets数据
	WSADATA wsadata;
	//初始化套接字,启动构建,将“ws2_32.lib”加载到内存中
	if (WSAStartup(sockVersion, &wsadata)) {
		printf("WSAStartup failed \n");
		return 0;
	}
	//创建一个套接字,即创建一个内核对象
	SOCKET hServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (hServer == INVALID_SOCKET) {
		printf("socket failed \n");
		return 0;
	}
	//创建服务器端地址并绑定端口号的IP地址
	sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(8889);
	addrServer.sin_addr.S_un.S_addr = INADDR_ANY;

	// 初始化内核对象,传参给内核对象,此时数据可能都处于未就绪链表
	int nRet = bind(hServer, (sockaddr*)&addrServer, sizeof(addrServer));
	if (nRet == SOCKET_ERROR) {
		printf("socket bind failed\n");
		closesocket(hServer);
		WSACleanup();
		return 0;
	}
     //创建一个客服端地址
	sockaddr_in  addrClient;
	int nlen = sizeof(addrClient);
	//创建一个中间变量,用于存放用户输入的信息
	//string str;

	//用于接受数据的缓冲区。
	char buffer[1024];
	//初始化缓冲区
	memset(buffer, 0, sizeof(buffer));

	int irecv;
	int isend;

	//可以循环接受数据
	while (true) {
	 //接收数据:
			//接受客户端的消息
		    irecv = recvfrom(hServer, buffer, sizeof(buffer), 0, (SOCKADDR*)&addrClient, &nlen);
			//缓冲区有数据,开始读取数据
			if (irecv > 0) {
				//判断数据是否为结束标志,若是则关闭服务器
				if (! (strcmp(buffer,"byebye"))) {
					//关闭服务器套接字
					cout << "ClientA: " << buffer << endl;
					cout << "close connection··· " << endl;
					closesocket(hServer);
					WSACleanup();
					cout << "5s后关闭控制它。" << endl;
					Sleep(5000);
					return 0;
				}
				else {
					cout << " ClientA:" << buffer<< endl;
				}
			}
			//接受数据失败
			else {
				cout << "recvFrom failed " << endl;
				closesocket(hServer);
				WSACleanup();
				cout << "5s后关闭控制台。" << endl;
				Sleep(5000);
				return 0;
			}
			//初始化缓冲区,用于下一次数据的接收
			memset(buffer, 0, sizeof(buffer));

      //发送数据:
			cout << "Server:";
			//从键盘获取数据
			cin >> buffer;
			//getline(cin, str);
			//建立发送数据缓冲区
			//const int len = sizeof(str);
			//char senddata[len];
			//strcpy_s(senddata, str.c_str());

			//发送数据
			isend=sendto(hServer, buffer, strlen(buffer), 0, (SOCKADDR*)&addrClient, nlen);
			if (isend == SOCKET_ERROR) {
				cout << "sendto failed " << endl;
				closesocket(hServer);
				WSACleanup();
				cout << "5s后关闭控制台。" << endl;
				Sleep(5000);
				return 0;
			}
			//str = "";
			//初始化缓冲区,用于下一次数据的接收
			memset(buffer, 0, sizeof(buffer));
	}

	//关闭服务器套接字
	closesocket(hServer);
	WSACleanup();
	return 0;
}

  • 客户端
// client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include"pch.h"
#include<iostream>
#include<WinSock2.h>
#include <string>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

int main() {

	//套接字信息结构
	WSADATA wsadata;
	//设置版本号
	WORD sockVersion = MAKEWORD(2, 2);
	//建立一个客户端套接字;
	SOCKET sClient;
	//启动构建,将“为ws2_32.lib”加载到内存中,做一些初始化工作
	if (WSAStartup(sockVersion, &wsadata) != 0) {
		//判断是否构建成功,若失败,则客户端打印一句提示话。
		printf("WSAStartup failed \n");
		return 0;
	}

	//创建客户端udp套接字
    sClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (SOCKET_ERROR == sClient) {
		printf("socket failed !\n");
		return 0;
	}

	//创建服务器端地址
	sockaddr_in serverAddr;
	//创建服务器端地址
	sockaddr_in clientAddr;
	//设置服务器端地址,端口号,协议族
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(8889);
	serverAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//获取服务器地址和客户端地址构造体的长度
	int slen = sizeof(serverAddr);
	int clen = sizeof(clientAddr);
	//设置接受数据缓冲区大小
	char buffer[1024];
	memset(buffer, 0, sizeof(buffer));
	//用于记录发送函数和接受函数的返回值
	int iSend = 0;
	int iRcv = 0;
	//string str;
	cout << "开始主动与服务器建立通信:" << endl;

	while (true) {
		
		   //从控制台获取数据
			cout << "Client: ";
			//getline(cin, str) ;
			cin >> buffer;
			//将string型数据处理成char数组型
			//const int len = sizeof(str);
			//char senddata[len];
			//strcpy_s(senddata, str.c_str());

			//发送信息给客户端
			iSend=sendto(sClient, buffer, strlen(buffer), 0, (SOCKADDR*)&serverAddr, slen);
			if (iSend== SOCKET_ERROR) {
				cout<<"sendto failed "<<endl;
				closesocket(sClient);
				WSACleanup();
				cout << "5s后关闭控制台。" << endl;
				Sleep(5000);
				return 0;
			}
			//若数据为byebye,断开连接
			if (!(strcmp(buffer, "byebye"))) {
				cout << "close connection " << endl;
				closesocket(sClient);
				WSACleanup();
				cout << "5s后关闭控制它。" << endl;
				Sleep(5000);
				return 0;
			}
			memset(buffer, 0, sizeof(buffer));

		//接受服务器端数据
			iRcv= recvfrom(sClient, buffer, sizeof(buffer), 0, (SOCKADDR*)&clientAddr,&clen);
			if (iRcv == SOCKET_ERROR) {
				cout << "recvFrom failed " << endl;
				closesocket(sClient);
				WSACleanup();
				cout << "5s后关闭控制台。" << endl;
				Sleep(5000);
				return 0;
			}
			//判断服务器是否关闭
			if (iRcv <= 0) {
				cout<< "server disconnected··· " << endl;
				closesocket(sClient);
				WSACleanup();
				cout << "5s后关闭控制台。" << endl;
				Sleep(5000);
				return 0;
			}
			else {
				cout << " Server: " << buffer << endl;
			}
			memset(buffer, 0, sizeof(buffer));

	}
	closesocket(sClient);
	WSACleanup();
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VSUDP通信 的相关文章

  • 回顾一:lili-om编译及运行问题(process has died、Leaf size is too small 等)[Livox Horizon激光雷达]

    度过考试周和作业周 xff0c 终于有时间可以搞自己的东西啦 xff0c 半个月前学习的东西忘得差不多了 xff0c 现在凭借着仅剩的记忆回顾一下 x1f604 末尾有小惊喜 xff0c 嘿嘿 xff01 1 Ceres Solver1 1
  • EXCEl 时间戳转换为日期格式

    1 EXCEl 时间戳转换为日期格式 公式为 xff1a 61 TEXT A2 1000 43 8 3600 86400 43 70 365 43 19 34 yyyy mm dd hh mm ss 34 具体操作如下 xff1a A2 1
  • 代码分析工具 - SonarQube

    1 常见代码质量分析工具 SonarQube xff1a 可以分析27多种不同编程语言中的代码 xff0c 并帮助您提高性能和检测安全漏洞 它由SonarSource的团队开发 xff0c 对社区免费开源 SonarQube可以添加到您的C
  • Lambda 表达式

    1 Lambda 表达式 1 1 通过接口传递代码 针对接口而非具体类型进行编程 xff0c 可以降低程序的耦合性 xff0c 提高灵活性 xff0c 提高复用性 接口常被用于传递代码 xff0c 比如 xff0c 我们知道 File 有如
  • Java 集合

    1 Java 集合框架 1 1 Java 集合概述 1 xff09 Java 容器 集合 数组都是对多个数据进行存储操作的结构 xff0c 简称 Java 容器 说明 xff1a 此时的存储 xff0c 主要指的是内存层面的存储 xff0c
  • 并发编程 - AQS 源码

    1 AQS 源码 public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java io Seriali
  • 解决C++中两个类的头文件互相包含问题

    转载 xff1a 134条消息 C 43 43 中两个类的头文件互相包含问题 道道道人间道的博客 CSDN博客 c 43 43 头文件互相包含 我们知道 xff0c 当一个类 xff08 设类A xff09 中包含另一个类 xff08 设类
  • 用递归的方法将整数n转换成字符串

    span class token keyword int span span class token function main span span class token punctuation span span class token
  • 关于&&和||的优先级问题

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • cpu与外设之间传送数据的时存在的问题

    一 速度不匹配 I O设备的速度比cpu慢很多 xff0c I O设备的不同速度差异也很大 二 时序不匹配 每个I O设备都有自己的定时控制电路 xff0c 无法与cpu取得统一 三 信息格式不匹配 不同的I O设备存储和处理信息的格式不同
  • 微机原理计算机基础部分简答题

    简述数据总线和地址总线各自具有的特点 xff0c 如果数据总线和地址总线采用同一组信号线有什么办法将地址总线分类出来 数据总线的特点为双向三态 xff0c 数据总线位数决定cpu一次传输二进制信息的位数 地址总线的特点为单向三态 xff0c
  • 部署IIS后dll not found

    问题 xff1a Could not load file or assembly 39 XX 39 or one of its dependencies An attempt was made to load a program with
  • 汇编指令对标志位的影响

    MOV LEA XCHG PUSH POP IN OUT 传送类指令不影响标志位 ADD ADC SUB SBB CMP 加减法指令影响全部标志位 INC DEC 增一减一指令不影响CF NEG 求补指令影响除CF外的5个标志位 xff0c
  • 微处理器部分简答题

    简述8086和8088cpu的相同点和不同点 相同点 xff1a 内部数据总线均为16位 xff0c 寄存器和指令系统完全兼容 不同点 xff1a 8086的外部数据总线为16位 xff0c 8088外部数据总线为8位 xff1b 8086
  • 大浪淘沙

    裸机指的是未装备任何软件的计算机 计算机的运行速度的单位是MI S xff0c 其含义是每秒钟执行百万条指令 影响cpu处理速度的主要因素是字长 主频 ALU 有无cache 冯诺依曼原理的基本思想是程序存储和程序控制 第一代计算机采用的电
  • 关于字符数组和字符指针

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • YOLOv5核心基础知识讲解

    我这主要是江大白老师的内容 xff01 xff01 深入浅出Yolo系列之Yolov3 amp Yolov4 amp Yolov5 amp Yolox核心基础知识完整讲解 xff08 CSDN xff09 深入浅出Yolo系列之Yolov5
  • 自旋锁的实现原理

    自旋锁的实现原理 自旋锁的介绍 自旋锁和互斥锁比较相似 xff0c 都是为了实现保护共享资源而提出的一种锁机制 xff0c 在任何一个时刻 xff0c 只有一个执行单元可以获取该锁 xff0c 如果该锁已经被别的单元占用 xff0c 那么调
  • 计算机网络(传输层)

    UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1 慢开始与拥塞避免2 快重传与快恢复 网络层只把分组发送到目的主机 xff0c

随机推荐

  • STM32 USART_Init() 初始化函数中BRR寄存器设置解析

    首先了解一下BRR寄存器的构造 xff1a 可以看到bit15 4设置USARTDIV的整数部分 xff0c bit 3 0设置USARTDIV的小数部分 所以小数部分相当于把1分为16份 xff0c 则DIV Fraction 61 小数
  • 安装libcxsparse3.1.2报错

    报错显示 xff1a yjq 64 yjq sudo apt get install liblapack dev libsuitesparse dev libcxsparse3 1 2 libgflags dev 正在读取软件包列表 完成
  • 网络技术基础(16)

    一 xff1a M HSRP的实施 1 1 HSRP 应用场景 1 路由器物理接口下 2 路由器逻辑子接口 3 xff5d 多层交换机SVI 接口下 1 2 M HSRP 定义 多组的HSRP xff0c 实际上就是一个接口参与多个HSRP
  • windows enable long environment path

    windows gt gpedit msc gt enter Edit Group Policy gt Local Computer Policy gt Computer Configuration gt Administrative Te
  • OpenMV与stm32,msp432等单片机的串口通讯(已经写好一个识别色块的例程,可直接使用)keil(MDK)

    OpenMV与stm32单片机的串口通讯 已经写好一个识别并使单片机得到色块信息的例程 可直接使用 keil MDK 已经写好一个识别色块的例程可直接使用 识别色块 单片机得到色块的中心坐标cx cy 长和高w h及面积s 直接复制源码使用
  • 树莓派python实现http请求控制海康威视摄像头转动

    由于海康威视sdk只支持x86架构处理器 xff0c 所以官方的 so无论无何也连接不上 xff0c 于是在咨询技术售后后 xff0c 我们选择http的方式发送指令控制摄像头在预设点移动 折腾了一天 xff0c 又是cookie啊 xff
  • 【ubuntu】ubuntu20.04安装ros noetic(亲测有效,附操作步骤)

    ubuntu20 04安装ros noetic xff0c 实力踩坑 xff0c 亲测有效 xff01 xff01 xff01 一 安装ROS neotic步骤第一步 xff1a 换源第二步 xff1a 添加ROS软件源第三步 xff1a
  • 【CMake】CMake构建C++代码(一)

    x1f449 博 主 x1f448 xff1a 米码收割机 x1f449 技 能 x1f448 xff1a C 43 43 Python语言 x1f449 公众号 x1f448 xff1a 测试开发自动化 x1f449 专 注 x1f448
  • UrlEncode C源码

    urlencode是一个函数 xff0c 可将字符串以URL编码 xff0c 用于编码处理 URL编码 URL encoding xff0c 也称作百分号编码 Percent encoding xff0c 是特定上下文的统一资源定位符 UR
  • OSPF详解(5种包和状态机)

    1 OSPF的数据包 xff08 5种 xff09 Hello xff1a 发现建立并周期保护邻居关系 DBD xff1a 数据库描述包 进行主从关系的选举 xff0c 最重要的作用是发送LSDB目录 LSR xff1a 链路状态请求 对收
  • BGP—origin属性的应用

    BGP origin属性 1 origin 是公认必遵属性 公认必遵 xff1a 只要不人为修改 xff0c 该属性就不会自己改变 origin属性描述该路由是如何成为BGP路由的 符号作用i通过network生成的BGP路由 xff1f
  • MPLS-虚拟专用网 实验(分支之间可以互通)

    1 MPLS V P N实验 xff08 分支之间可以互通 xff09 实验要求 xff1a 1 A1和A2可以通过MPLS V P N打通 xff0c B1和B2可以打通 xff0c A不能访问B 2 R2为ISP 3 R6可以telne
  • vmware ESXi中安装windows11(解决VMware安装Windows11报错+win11跳过联网操作)

    文章目录 vmware ESxi 安装windows111 安装步骤2 Vmware安装win11报错解决方案2 1 问题产生原因 xff1a 2 2 解决方案 xff1a 3 Windows11安装过程中跳过联网操作 xff08 在无法连
  • python 修改ip地址

    安装包 pip install wmi pip install pywin32 实现 import wmi Obtain network adaptors configurations nic configs 61 wmi WMI Win3
  • Postman前置脚本-全局变量和环境变量

    全局变量和环境变量 61 61 全局变量和环境变量 61 61 Postman 请求前置脚本时间戳案例工作原理 全局变量和环境变量 全局变量 概念 xff1a 在 Postman 全局生效的变量 xff0c 全局唯一 设置 xff1a 代码
  • kubernetes❀集群环境搭建

    kubernetes 集群环境搭建 2 kubernetes集群环境搭建2 1 前置知识点2 2 kubeadm 部署方式介绍2 3 安装要求2 4 最终目标2 5 准备环境2 6 环境初始化2 6 1 检查操作系统的版本2 6 2 主机名
  • kubernetes❀资源管理

    kubernetes 资源管理 3 资源管理3 1 资源管理介绍3 2 YAML语言介绍3 3 资源管理方式3 3 1 命令式对象管理3 3 2 命令式对象配置3 3 3 声明式对象配置 3 资源管理 3 1 资源管理介绍 在kuberne
  • Kubernetes❀实战入门

    Kubernetes 实战入门 4 实战入门4 1 Namespace4 1 1 查看 4 1 2 创建 4 1 3 删除 4 1 4 配置方式 4 2 Pod4 2 1 创建并运行4 2 2 查看pod信息4 2 3 访问Pod4 2 4
  • Qt重定向问题

    概念 在我们使用软件时大多使用release版本 xff0c 这样在使用过程中的调试信息就不会显示出来 xff0c 为了将调试信息打印在界面上或者放在文件中保存起来我们就可以使用重定向的技术 在QT的帮助文档 xff1a qInstallM
  • VSUDP通信

    好久没弄VS的UDP通信了 xff0c 使用方式都忘记的差不多了 今天遇到了正好学习一下 UDP理论 xff1a UDP参考链接 xff1a socket函数 为了执行网络输入输出 xff0c 一个进程必须做的第一件事就是调用socket函