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

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…...

自由程序员想接私活?那你还不得知道这几个接单平台!最后一个就是宝藏!!

相信喜欢搞钱的程序员都知道&#xff0c;平常在平台上接点私活&#xff0c;利用闲暇时间接单是搞钱的常用套路&#xff0c;可是你确定你选对平台了吗&#xff1f;不管你是刚准备接单的小白&#xff0c;还是已经干了一段时间的老油条&#xff0c;都建议你看完本期文章&#xff0…...

二叉树与递归的相爱相杀

数据结构之二叉树 一、基于二叉树的基础操作1.二叉树的构建2.二叉树的遍历①前序遍历&#xff08;深度遍历&#xff09;②中序遍历③后序遍历④层序遍历判断一棵二叉树是否是完全二叉树&#xff08;基于层序遍历的思想&#xff09; 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字节&#xff0c;只有一个字节例子二,不足3字节&#xff0c;只有两个字节 base64示例代码1代码分析 acl…...

gazebo各种插件

类别 libgazebo_ros_api_plugin.so&#xff1a;提供与Gazebo仿真环境进行通信的API接口。 libgazebo_ros_block_laser.so&#xff1a;模拟激光传感器的插件。 libgazebo_ros_bumper.so&#xff1a;模拟碰撞传感器的插件。 libgazebo_ros_camera.so&#xff1a;模拟相机传感器的…...

C语言Free空指针会怎样?

在C语言中&#xff0c;使用free函数释放一个空指针是安全的&#xff0c;不会引发任何错误或异常。具体来说&#xff0c;当使用free函数释放一个空指针时&#xff0c;free函数会忽略这个空指针&#xff0c;并且不会执行任何操作。这是因为free函数只对有效的指针进行内存释放操作…...

软件测试全套教程,软件测试自学线路图

软件测试&#xff1a; 软件测试是为了发现程序中的错误而执行程序的过程。 通俗的说&#xff0c;软件测试需要在发布软件之前&#xff0c;尽可能的找软件的错误&#xff0c;尽量避免在发布之后给用户带来不好的体验&#xff0c;并要满足用户使用的需求。 现在市面上这么多软…...

禁止浏览器缩放

禁止浏览器缩放 1. 页面中添加如下代码&#xff1a;2. css单位统一使用rem&#xff0c;如下&#xff1a; 两个条件即可实现&#xff1a; 1. 动态修改html属性fontsize的值&#xff1b; 2. css单位统一使用rem。 1. 页面中添加如下代码&#xff1a; // 定义基准字体 new functi…...

前端食堂技术周刊第 100 期:TS 5.3 Beta、ViteConf2023、Rspress 1.0、Fresh 1.5、Chrome 118

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;乌龙金桂 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…...

汇川IT7000系列HMI使用脚本实现画面跳转时自动切换手自动模式

汇川IT7070E工业HMI使用实例(1) 用脚本切换模式 我们在使用工业HMI做画面时,可能会有这样的需求,希望切换画面时,可以根据不同的画面,自动切换相应的模式,比如有些画面是进行手动操作的,有些画面是进行自动操作的,当我们需要手动时,希望进入画面自动切换为“手动模…...

FDTD Solutions笔记

FDTD Solutions笔记 目录使用流程实例 目录 使用流程 实例 材料条件 步骤 基底 2. 添加规则膜层 3. 添加仿真区 解释&#xff1a; 仿真区为&#xff08;0,0&#xff09;&#xff0c;x方向为0.4&#xff0c;y方向是1 解释&#xff1a; 一般先用低精度进行计算 解释&#xff1a…...

SQL SELECT DISTINCT(选择不同) 语法

SQL SELECT DISTINCT 语法 SELECT DISTINCT语法用于仅返回不同的&#xff08;different&#xff09;值。 在一张表内&#xff0c;一列通常包含许多重复的值; 有时你只想列出不同的&#xff08;different&#xff09;值。 SELECT DISTINCT语句用于仅返回不同的&#xff08;diffe…...

常见的数据结构及应用

文章目录 前言数据结构介绍数组链表队列和栈树堆 总结 前言 数据结构是计算机存储、组织数据的方式。在工作中&#xff0c;我们通常会直接使用已经封装好的集合API&#xff0c;这样可以更高效地完成任务。但是作为一名程序员&#xff0c;掌握数据结构是非常重要的&#xff0c;…...

基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【UE5 Cesium】19-Cesium for Unreal 建立飞行跟踪器(4)

遗留问题 在上一篇博客中&#xff08;【UE5 Cesium】18-Cesium for Unreal 建立飞行跟踪器&#xff08;3&#xff09;&#xff09;&#xff0c;我们实现了飞机变速飞行的功能&#xff0c;但是还存在两个问题&#xff0c;分别是&#xff1a; &#xff08;1&#xff09;由于UE的…...

TrustZone

TrustZone技术 让我们从最重要的问题开始&#xff1a;为什么存在TrustZone技术&#xff0c;它防御什么&#xff1f;保护用 C 和 C 编写的大型程序免受黑客攻击可能是一个挑战。内存损坏漏洞是一个常见问题&#xff0c;尽管消除它们是安全工程师的核心目标&#xff0c;但从操作…...

✔ ★【备战实习(面经+项目+算法)】 10.16学习时间表(总计学习时间:5h)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…...

React + Router

React Router 这个只是专门讲解 React Router 新开的例子。 教程来源&#xff1a;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…...

微信小程序设置动态变量设值

微信小程序设置动态变量设值 微信小程序如何动态变量设值&#xff1f; 示例代码如下&#xff1a; setValFunc() {const key this.data.currentPickerid; // 业务需求动态键值key&#xff0c;或者是上一界面获取的动态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 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 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. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...