C++ UDP通信
#pragma once
#ifndef XUDP_H
#define XUDP_H#ifdef WIN32
#include <windows.h>
#define socklen_t int
#else
#include <arpa/inet.h>
#define closesocket close //替换close函数
#include <unistd.h>#include<iostream>
#endifclass XUdp
{
public:int CreateSocket(); // 1 创建套接字bool Bind(); // 2 绑定并监听端口号int Send(const char* buf, int size, char* ip, unsigned short port); //3 发送数据int Recv(char* buf, int bufsize, sockaddr_in* from); // 4 接收数据void Close(); // 5 关闭连接int SetRecvTimeout(int sec); //设置udp接收超时int SetSendTimeout(int sec); //设置udp发送超时XUdp(unsigned short port = 9000);virtual ~XUdp();private:int usock = 0; //udp服务端的socket create成员函数自己生成unsigned short uport = 0; //构造函数从外获取};
#endif
#include "XUdp.h"
#include <iostream> //IO流操作
#include <string> //string标准库
#ifdef WIN32
#include <windows.h>
#define socklen_t int#else
#include <arpa/inet.h>
#define closesocket close //替换close函数
#include <unistd.h>
#include <pthread.h>
#endifXUdp::XUdp(unsigned short port)
{//初始化动态链接库//引用lib库
#ifdef WIN32 //linux下不用初始化网络库static bool first = true;if (first){first = false; //只在首次进入时初始化网络库WSADATA ws; //加载Socket库 项目属性-链接器-输入加上 ws2_32.libWSAStartup(MAKEWORD(2, 2), &ws); //动态库引用加1 }
#endifuport = port;printf("port:%d connect ! \n",port);
}XUdp::~XUdp()
{//delete this;
}int XUdp::CreateSocket() //创建套接字
{usock = socket(AF_INET, SOCK_DGRAM, 0); //TCP/IP UDP 创建udp 套接字if (usock == -1){printf("create udp socket failed.\n");return -1;}printf("create udp socket success.\n");return 0;
}void XUdp::Close() //关闭连接
{if (usock <= 0) return; //socket出错closesocket(usock); //已宏定义usock = 0;uport = 0;
}bool XUdp::Bind() //绑定并监听端口号
{sockaddr_in saddr; //数据结构saddr.sin_family = AF_INET; //协议saddr.sin_port = htons(uport); //端口,主机字节序(小端方式)转换成网络字节序(大端方式)// saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); saddr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定IP到广播地址INADDR_ANY 0.0.0.0 为了兼容linux if (bind(usock, (sockaddr*)&saddr, sizeof(saddr)) != 0) //安装sockaddr_in数据结构绑定套接字{printf("udp bind port %d failed.\n", uport);return false;}printf("udp bind port %d success.\n", uport);return true;
}int XUdp::Send(const char* buf, int size, char* ip, unsigned short port) //发送数据(强制全部发送)
{int sendedSize = 0; //已发送成功的长度sockaddr_in saddr;saddr.sin_family = AF_INET; //tcp/ip协议saddr.sin_port = htons(port);//服务端的端口 主机字节序转换成网络字节序saddr.sin_addr.s_addr = inet_addr(ip); //本机的ip地址 字符串ip地址转成整型while (sendedSize != size) //若没发送完成,则从断点开始继续发送 直到完成{int len = sendto(usock, buf + sendedSize, size - sendedSize, 0, (sockaddr*)&saddr, sizeof(saddr));if (len <= 0)break;sendedSize += len;}return sendedSize;
}int XUdp::Recv(char* buf, int bufsize, sockaddr_in* from) //接收数据
{socklen_t len = sizeof(sockaddr_in);int re = recvfrom(usock, buf, bufsize, 0, (sockaddr*)from, &len); //返回接收的客户端的网络地址,存在在地址中return re;
}int XUdp::SetRecvTimeout(int sec = 1) //设置udp接收超时
{
#ifdef WIN32int udp_rev_time = sec * 1000;if (setsockopt(usock, SOL_SOCKET, SO_RCVTIMEO, (char*)&udp_rev_time, sizeof(int)) < 0){printf("set udp receive failed.\n");return -1;}printf("set udp recv timeout success. %d seconds\n", sec);return 0;
#elsestruct timeval udp_rev_time;udp_rev_time.tv_sec = sec;udp_rev_time.tv_usec = 0;if (setsockopt(usock, SOL_SOCKET, SO_RCVTIMEO, (char*)&udp_rev_time, sizeof(udp_rev_time)) < 0){printf("set udp receive failed.\n");return -1;}printf("set udp recv timeout success. %d seconds\n", sec);return 0;
#endif
}int XUdp::SetSendTimeout(int sec = 1) //设置udp发送超时
{
#ifdef WIN32int udp_rev_time = sec;if (setsockopt(usock, SOL_SOCKET, SO_SNDTIMEO, (char*)&udp_rev_time, sizeof(int)) < 0){printf("set udp send failed.");return -1;}return 0;printf("set udp send timeout success. %d seconds\n", sec);
#elsestruct timeval udp_rev_time;udp_rev_time.tv_sec = sec;udp_rev_time.tv_usec = 0;if (setsockopt(usock, SOL_SOCKET, SO_SNDTIMEO, (char*)&udp_rev_time, sizeof(udp_rev_time)) < 0){printf("set udp send failed.");return -1;}printf("set udp send timeout success. %d seconds\n", sec);return 0;
#endif
}
接收:
#include"XUdp.h"
#include<stdio.h>int main()
{XUdp xudp(6000); // 绑定端口xudp.CreateSocket(); // int r = xudp.Bind();if (r == -1){printf("绑定失败:%d\n",GetLastError());xudp.Close();}char buff[256];int buffsize = sizeof(buff);SOCKADDR_IN client;while (1){int re = xudp.Recv(buff,buffsize, &client);if (re != -1){printf("recv_len = >%d \n", re);buff[re] = 0;printf("recv: %s \n",buff);}}system("pause");return 0;
}
发送创建
#include"client.h"
#include<stdio.h>
#include<iostream>int main()
{XUdp xudp(6000);xudp.CreateSocket();int r = xudp.Bind();if (r == -1){printf("绑定失败:%d\n", GetLastError());xudp.Close();}char buff[256];char ip[16];strcpy_s(ip,"127.0.0.1");while (1){memset(buff,0,256);printf("send:");scanf_s("%s",buff,sizeof(buff));xudp.Send(buff,strlen(buff),ip, 6000);}system("pause");return 0;
}
相关文章:
C++ UDP通信
#pragma once #ifndef XUDP_H #define XUDP_H#ifdef WIN32 #include <windows.h> #define socklen_t int #else #include <arpa/inet.h> #define closesocket close //替换close函数 #include <unistd.h>#include<iostream> #endifclass XUdp { pub…...
自由程序员想接私活?那你还不得知道这几个接单平台!最后一个就是宝藏!!
相信喜欢搞钱的程序员都知道,平常在平台上接点私活,利用闲暇时间接单是搞钱的常用套路,可是你确定你选对平台了吗?不管你是刚准备接单的小白,还是已经干了一段时间的老油条,都建议你看完本期文章࿰…...
二叉树与递归的相爱相杀
数据结构之二叉树 一、基于二叉树的基础操作1.二叉树的构建2.二叉树的遍历①前序遍历(深度遍历)②中序遍历③后序遍历④层序遍历判断一棵二叉树是否是完全二叉树(基于层序遍历的思想) 3.二叉树的数量问题①求二叉树结点个数②求二…...
Docker 安装 reids
docker run -itd --name myredis -p 6379:6379 redis --requirepass “123456” --restartalways --appendonly yes...
opensl学习——base16编码解码、base64编码解码、ASCII码表、扩展ASCII码
文章目录 ASCII表概述base家族简单说明 Hex(十六进制)编码、Base32编码、Base64编码、base256编码base16编码与解码base64编码概述转换过程不足 3 字节处理方法例子一,不足3字节,只有一个字节例子二,不足3字节,只有两个字节 base64示例代码1代码分析 acl…...
gazebo各种插件
类别 libgazebo_ros_api_plugin.so:提供与Gazebo仿真环境进行通信的API接口。 libgazebo_ros_block_laser.so:模拟激光传感器的插件。 libgazebo_ros_bumper.so:模拟碰撞传感器的插件。 libgazebo_ros_camera.so:模拟相机传感器的…...
C语言Free空指针会怎样?
在C语言中,使用free函数释放一个空指针是安全的,不会引发任何错误或异常。具体来说,当使用free函数释放一个空指针时,free函数会忽略这个空指针,并且不会执行任何操作。这是因为free函数只对有效的指针进行内存释放操作…...
软件测试全套教程,软件测试自学线路图
软件测试: 软件测试是为了发现程序中的错误而执行程序的过程。 通俗的说,软件测试需要在发布软件之前,尽可能的找软件的错误,尽量避免在发布之后给用户带来不好的体验,并要满足用户使用的需求。 现在市面上这么多软…...
禁止浏览器缩放
禁止浏览器缩放 1. 页面中添加如下代码:2. css单位统一使用rem,如下: 两个条件即可实现: 1. 动态修改html属性fontsize的值; 2. css单位统一使用rem。 1. 页面中添加如下代码: // 定义基准字体 new functi…...
前端食堂技术周刊第 100 期:TS 5.3 Beta、ViteConf2023、Rspress 1.0、Fresh 1.5、Chrome 118
美味值:🌟🌟🌟🌟🌟 口味:乌龙金桂 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
汇川IT7000系列HMI使用脚本实现画面跳转时自动切换手自动模式
汇川IT7070E工业HMI使用实例(1) 用脚本切换模式 我们在使用工业HMI做画面时,可能会有这样的需求,希望切换画面时,可以根据不同的画面,自动切换相应的模式,比如有些画面是进行手动操作的,有些画面是进行自动操作的,当我们需要手动时,希望进入画面自动切换为“手动模…...
FDTD Solutions笔记
FDTD Solutions笔记 目录使用流程实例 目录 使用流程 实例 材料条件 步骤 基底 2. 添加规则膜层 3. 添加仿真区 解释: 仿真区为(0,0),x方向为0.4,y方向是1 解释: 一般先用低精度进行计算 解释:…...
SQL SELECT DISTINCT(选择不同) 语法
SQL SELECT DISTINCT 语法 SELECT DISTINCT语法用于仅返回不同的(different)值。 在一张表内,一列通常包含许多重复的值; 有时你只想列出不同的(different)值。 SELECT DISTINCT语句用于仅返回不同的(diffe…...
常见的数据结构及应用
文章目录 前言数据结构介绍数组链表队列和栈树堆 总结 前言 数据结构是计算机存储、组织数据的方式。在工作中,我们通常会直接使用已经封装好的集合API,这样可以更高效地完成任务。但是作为一名程序员,掌握数据结构是非常重要的,…...
基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【UE5 Cesium】19-Cesium for Unreal 建立飞行跟踪器(4)
遗留问题 在上一篇博客中(【UE5 Cesium】18-Cesium for Unreal 建立飞行跟踪器(3)),我们实现了飞机变速飞行的功能,但是还存在两个问题,分别是: (1)由于UE的…...
TrustZone
TrustZone技术 让我们从最重要的问题开始:为什么存在TrustZone技术,它防御什么?保护用 C 和 C 编写的大型程序免受黑客攻击可能是一个挑战。内存损坏漏洞是一个常见问题,尽管消除它们是安全工程师的核心目标,但从操作…...
✔ ★【备战实习(面经+项目+算法)】 10.16学习时间表(总计学习时间:5h)
✔ ★【备战实习(面经项目算法)】 坚持完成每天必做如何找到好工作1. 科学的学习方法(专注!效率!记忆!心流!)2. 每天认真完成必做项,踏实学习技术 认真完成每天必做&…...
React + Router
React Router 这个只是专门讲解 React Router 新开的例子。 教程来源:https://reactrouter.com/en/main/start/tutorial 创建新项目 yarn create vite my-react-router-app --template react-ts cd my-react-router-app yarn安装 React Router 依赖: yarn add…...
微信小程序设置动态变量设值
微信小程序设置动态变量设值 微信小程序如何动态变量设值? 示例代码如下: setValFunc() {const key this.data.currentPickerid; // 业务需求动态键值key,或者是上一界面获取的动态key值const value 变量值;this.setData({[${key}]: valu…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
