当前位置: 首页 > 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…...

闪站侠洗衣洗鞋多门店多用户管理系统,洗鞋店干洗店小程序开发;

闪站侠洗护软件是多分店多用户管理系统&#xff0c;一个分店可以同时关联多个用户。闪站侠洗护管理软件通过互联网为洗衣店/洗鞋店干洗店提供加盟或直营连锁管理&#xff1b; 实现会员洗衣的门店收衣->上门收衣->开单拍照->清洗护理/工厂洗涤->微&#xff5c;信/短…...

JDBC增删改查示例

数据库表 CREATE TABLE customers ( id int NOT NULL AUTO_INCREMENT, name varchar(15) DEFAULT NULL, email varchar(20) DEFAULT NULL, birth date DEFAULT NULL, photo mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT39 DEFAULT CHARSETgb2312;…...

emqx broker安装

emqx broker安装 Emq x百万级开源 MQTT 消息服务器 是基于 Erlang/OTP 语言平台开发 一款完全开源&#xff0c;高可用低时延的百万级分布式物联网 MQTT 5.0 消息服务器 官方地址: https://www.emqx.com/zh Centos7 安装 #下载Centos7 amd64位版本 wget https://www.emqx.c…...

如何选择国产压力测试工具?

随着互联网的飞速发展&#xff0c;软件应用的性能和稳定性变得愈发重要。无论是在线购物网站、社交媒体平台还是移动应用程序&#xff0c;用户都期望能够快速、流畅地访问和使用它们。为了确保应用程序在高负载下仍能够正常运行&#xff0c;压力测试工具变得至关重要。在国内&a…...

基于AT89C51流水花样灯proteus仿真设计

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a; 三、仿真工程&#xff1a; c51单片机流水灯花样灯proteus仿真设计资源-CSDN文库...

android U广播详解(二)

android U广播详解&#xff08;一&#xff09; 基础代码介绍 广播相关 // 用作单个进程批量分发receivers&#xff0c;已被丢弃 frameworks/base/services/core/java/com/android/server/am/BroadcastReceiverBatch.java // 主要逻辑所在类&#xff0c;包括入队、分发、结束…...

导航守卫的使用记录和beforeEach( )死循环的问题

前置导航守卫beforeEach的使用 import Vue from vue import VueRouter from vue-router // 进度条 import NProgress from nprogress import nprogress/nprogress.cssVue.use(VueRouter)// 路由表 const routes [{path: "/",redirect: "/home",},{path: …...

SpringMVC源码分析(三)HandlerExceptionResolver启动和异常处理源码分析

问题&#xff1a;异常处理器在SpringMVC中是如何进行初始化以及使用的&#xff1f; Spring MVC提供处理异常的方式主要分为两种&#xff1a; 1、实现HandlerExceptionResolver方式&#xff08;HandlerExceptionResolver是一个接口&#xff0c;在SpringMVC有一些默认的实现也可以…...

系统架构与Tomcat的安装和配置

2023.10.16 今天是学习javaweb的第一天&#xff0c;主要学习了系统架构的相关知识和原理&#xff0c;下载了web服务器软件&#xff1a;Tomcat&#xff0c;并对其进行了配置。 系统架构 包括&#xff1a;C/S架构 和 B/S架构。 C/S架构&#xff1a; Client / Server&#xff0…...

【Shell脚本】根据起止日期获取Alert日志内容

【Shell脚本】根据起止日期获取Alert日志内容 根据输入的起止日期字符串&#xff0c;检索Oracle告警日志&#xff0c;打印中间的日志行内容。 #!/bin/bash # $1 START_TIME_STR, e.g. "Oct 17 07:" # $2 END_TIME_STR, e.g. "Oct 17 08:" source /home/o…...