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;
}

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

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

相关文章

源代码审计(白盒测试)

1.简介 代码安全测试是从安全的角度对代码进行安全测试评估 2.测试的方法 人工审核和静态分析工具辅助进行 人工审核&#xff1a;既能解决内部问题也能解决外部问题。是目前最有效率的解决方案&#xff0c;并且在理论上手工代码审核是非常有效的&#xff0c;但人工审核的效率不…

element表格实现单选框

利用checkbox来实现表格单选,思路就是将checkbox的值绑定到当前行mainFlag,定义checkbox的change事件,每当值改变时将上次选中的行数据mainFlag改给false <template><el-table:data"tableData"style"width: 100%"><el-table-column label&q…

视频推拉流/直播点播平台EasyDSS分享的链接提示“无信号”,该如何解决?

视频直播点播平台EasyDSS可支持用户自行上传视频文件&#xff0c;也可将上传的点播文件作为虚拟直播进行播放。平台能支持多屏播放&#xff0c;可兼容Windows、Android、iOS、Mac等操作系统&#xff0c;还能支持CDN转推&#xff0c;具备较强的可拓展性与灵活性。 为给用户提供更…

Git 提交规范

遇到的问题 在项目中采用 git 管理代码版本时&#xff0c;突然不能进行提交&#xff08;git commit&#xff09;。 报错信息如下&#xff1a; ERROR invalid commit message format. Proper commit message format is required for automated changelog generation. Git 规范…

AI 浪潮下的创业故事(一)—— Jina AI

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

SaaS 完整指南

什么是软件即服务 (SaaS)&#xff1f; 软件即服务 (SaaS) 是云计算的三个组成部分之一&#xff0c;是一种软件分发模型&#xff0c;其中第三方提供商托管应用程序&#xff0c;最终用户可以通过 Internet 访问软件。 SaaS 应用程序开发使组织无需在自己的计算机或自己的数据中…

CentOS7 内核升级

1.linux内核版本说明 https://en.wikipedia.org/wiki/Linux_kernel_version_history The Linux Kernel Archives - Releases

【Python】Python 实现 Excel 到 CSV 的转换程序

Python 实现 Excel 到 CSV 的转换程序 Excel 可以将电子表格保存为 CSV 文件&#xff0c;只要点几下 鼠标&#xff0c;但如果有几百个 Excel文件要转换为 CSV &#xff0c; 就需要点击几小时。利用 openpyxl 模块&#xff0c; 编程读取当前工作目录中的所有 Excel 文件&#x…

Mobpush智能化精准推送,助力求职者快人一步

近日&#xff0c;“BOSS”直聘崩了的消息又又又上了热搜&#xff0c;2023年9月15日上午&#xff0c;BOSS直聘在线统计超过4700万人。由此可见&#xff0c;随着金九银十招聘旺季的到来&#xff0c;求职软件成为人们的青睐。但是对于大多数使用招聘软件的用户而言&#xff0c;往往…

unigui点击按钮后弹出悬浮窗,几秒钟后关闭

为了实现点击按钮后&#xff0c;复制内容到剪切板&#xff0c;然后弹出悬浮窗提示给用户。 js代码如下&#xff0c;复制内容&#xff0c;然后保存命名为.js的文件&#xff1a; //弹窗提醒function showAlert(s_msg) {// 创建 div 元素var div document.createElement("d…

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【合并区间】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

【vr】【unity】白马VR课堂系列-VR开发核心基础05-主体设置-手柄对象的引入和设置

【视频教学】 【白马VR课堂系列-VR开发核心基础05-主体设置-手柄对象的引入和设置】 https://www.bilibili.com/video/BV19D4y1N73i/?share_source=copy_web&vd_source=7f5c96f5a58b7542fc6b467a9824b04e 【内容】 上一节引入了XR Origin并进行了初步设置,运行测试时V…

数据库主从切换过程中Druid没法获取连接错误

背景&#xff1a; 今天dba在进行DB的主从切换&#xff0c;导致应用一直报错&#xff0c;获取不到DB连接&#xff0c;druid的错误信息如下&#xff1a; Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutExc…

基于主动移频法与AFD孤岛检测的单相并网逆变器matlab仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真模型 算法介绍 (1)仿真模型由单相电网、逆变器、滤波环节、PI控制器、PWM生成器、锁相环、AFD控制器s函数、测量模块等构成&#xff1b; (2)采用主动移频法(AFD)进行孤岛检测&#xff1b; (3)相应速度…

CMake教程-第 7 步:添加系统自省功能

CMake教程-第 7 步&#xff1a;添加系统自省功能 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Adding Sup…

基于springboot实现汉服文化分享平台项目【项目源码+论文说明】

摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述汉服文化平台网站的当前背景以及系统开发的…

【Linux常用命令12】搜索命令及特殊字符的使用

which&#xff1a;查看可执行文件的位置 which 命令whereis&#xff1a;查看文件的位置&#xff0c;只能用于程序名的搜索 whereis [选项] 命令 -b 定位可执行文件。 -m 定位帮助文件。 -s 定位源代码文件。 -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外…

Python 中的省略号对象

作为一名经验丰富的 Python 开发人员&#xff0c;您可能遇到过 Python 中的三个点…省略号对象。 如果您尝试在 Python 解释器中打印此内容&#xff0c;它将显示一个省略号。 本篇文章将介绍 Python 中省略号对象的使用。 使用省略号作为未编写代码的占位符 省略号对象可以以…

【vue2高德地图api】02-npm引入插件,在页面中展示效果

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、安装高德地图二、在main.js中配置需要配置2个key值以及1个密钥 三、在页面中使用3.1 新建路由3.2新建vue页面3.2-1 index.vue3.2…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程的集成方法与步骤(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 由于大家最自定义业务表单的整个集成方法还不熟悉&#xff0c;下面大概介绍一下这个流程与方法。 1、首先…