linux---UDP代码通信

2023-05-16

udp连接特性

  • 无连接:可以不构成连接就进行通信
  • 不可靠:数据并不能保证可靠性
  • 面向数据报:每条数据有长度限制,整条数据发送整条数据接受,传输不灵活,但是不会存在粘包问题。
    原理在网络版块讲解
    udp通信流程
    在这里插入图片描述

c++封装udp接口,封装接口便于我们更好的实现

  1 /*
  2  *udp的封装接口
  3  */
  4 #include <iostream>
  5 #include <string>
  6 #include <stdio.h>
  7 #include <unistd.h>
  8 #include <sys/socket.h>
  9 #include <errno.h>
 10 #include <stdlib.h>
 11 #include <netinet/in.h>
 12 #include <arpa/inet.h>
 13 
 14 class UdpSocket{
 15 public:
 16     UdpSocket():_socket(-1){
 17     };
 18     ~UdpSocket(){
 19     };
 20     //创建socket
 21     bool Socket(){
 22         _socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
 23         if(_socket < 0){
 26         }
 27         return true;
 28     }
 29     //绑定连接
 30     bool Bind(std::string ip,uint16_t port){
 31         struct sockaddr_in addr;
 32         addr.sin_family = AF_INET;
 33         addr.sin_port = htons(port);
 34         addr.sin_addr.s_addr = inet_addr(ip.c_str());
 35 
 36         int len = sizeof(addr);
 37 
 38         int ret = bind(_socket,(struct sockaddr*)&addr,len);
 39         if(ret < 0){
 40             perror("bind error\n");
 41             return false;
 42         }
 43         return true;
 44     }
 45     //接受数据
 46     bool Recv(std::string &buf,struct sockaddr_in *saddr){
 47         //*daddr是发送的ip信息
 48         //  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
 49         //  struct sockaddr *src_addr, socklen_t *addrlen);
 50         char temp[1500];
 51         socklen_t len = sizeof(struct sockaddr_in);
 53         if(ret < 0){
 54             perror("recvfrom error\n");
 55             return false;
 56         }
 57         buf.assign(temp,ret);
 58         return true;
 59     }
 60     //发送数据
 61     bool Send(std::string& str,struct sockaddr_in* daddr){
 62     //  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
 63     //  const struct sockaddr *dest_addr, socklen_t addrlen);
 64         int len = sizeof(struct sockaddr_in);
 65         int ret = sendto(_socket,str.c_str(),str.size(),0 
 66                 ,(struct sockaddr*)daddr,len);
 67         if(ret < 0){
 68             perror("sendto error\n");
 69             return false;
 70         }
 71         return true;
 72     }
 73     //关闭连接
 74     bool Close(){
 75         close(_socket);
 76         _socket = -1;
 77     }
 78     private:
 79     int  _socket;
 80 }; 

udp服务端的实现

4 #include "udpsocket.hpp"
  5 #define CHECK(T) if(!T) {return -1;}
  6 int main(int argc,char* argv[]){
  1 /*
  2  *实现udp服务器端
  3  */
  4 #include "udpsocket.hpp"
  5 #define CHECK(T) if(!T) {return -1;}
  6 int main(int argc,char* argv[]){
  7     //将我们的ip地址通过参数进行传递
  8     if(argc < 3){
  9         perror("./a.out ip port\n");
 10         return -1;
 11     }
 12     std::string ip = argv[1];//ip地址的信息
 13     uint16_t port = atoi(argv[2]);//port端口信息
 14     //创建封装的类
 15     UdpSocket sock;
 16     //创建我们的套接字
 17     CHECK(sock.Socket());
 18     //绑定
 19     CHECK(sock.Bind(ip,port));
 20     while(1){
 21         //接受数据
 22         std::string str;
 23         struct sockaddr_in client_addr;
 24         CHECK(sock.Recv(str,&client_addr));
 25         std::cout<<"client said:"<<str<<std::endl;
 26         std::string answer;
 27         std::cout<<"server say:";
 28         fflush(stdout);
 29         std::cin>>answer;
 30         CHECK(sock.Send(answer,&client_addr));
 31     }
 32     sock.Close();
 33     return 0;
 34 }  

udp客户端代码实现

  1 /*
  2  udp客户端程序实现
  3  */
  4 #include "udpsocket.hpp"
  5 
  6 #define CHECK(T) if(!T) {return -1;}
  7 int main(int argc,char* argv[]){
  8     if(argc < 3){
  9         perror("./a.out ip port\n");
  1 /*
  2  udp客户端程序实现
  3  */
  4 #include "udpsocket.hpp"
  5 
  6 #define CHECK(T) if(!T) {return -1;}
  7 int main(int argc,char* argv[]){
  8     if(argc < 3){
  9         perror("./a.out ip port\n");
 10         return -1;
 11     }
 12     std::string ip = argv[1];
 13     uint16_t port = atoi(argv[2]);
 14 
 15     UdpSocket sock;
 16     //创建套接字
 17     CHECK(sock.Socket());
 18     //客户端不用创建连接,绑定的是绑定的服务器端的地址信息
 19     struct sockaddr_in ser_addr;
 20     ser_addr.sin_family = AF_INET;
 21     ser_addr.sin_port = htons(port);
 22     ser_addr.sin_addr.s_addr = inet_addr(ip.c_str());
 23     
 24     while(1){
 25         //发送数据
 26         std::string str;
 27         std::cout<<"client say:";
 28         fflush(stdout);
 29         std::cin>>str;
 30         CHECK(sock.Send(str,&ser_addr));
 31         std::string answer;
 32         CHECK(sock.Recv(answer,&ser_addr));
 33         std::cout<<"server said:"<<answer<<std::endl;
 34     }
 35     sock.Close();
 36     return 0;
 37 }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux---UDP代码通信 的相关文章

随机推荐

  • C语言小函数——删除字符串str1中含有的字符串str2

    本函数实现的是删除str1中的含有的所有str2 char span class hljs variable delstr span char span class hljs variable src span const char spa
  • 设备树简介

    设备树简介 一 xff1a 设备树由来 linux内核源码中 xff0c 之前充斥着大量的平台相关 xff08 platform Device xff09 配置 xff0c 而这些代码大多是杂乱且重复的 xff0c 这使得ARM体系结构的代
  • NVIDIA TX2上手体验

    NVIDIA TX2上手体验 硬件基础刷机流程远程登陆CAN总线调试回环模式硬件测试 硬件基础 新入手Nvidia TX2开发套件 xff0c 准备安装ubuntu16 04 xff0c 对应jetpack3 3版本 刷机流程 首先你要有一
  • 解决Pixhawk启动解锁过程中出现一些问题

    硬件 xff1a pixhawk2 4 6 固件 xff1a PX4 1 6 4 平台 xff1a linux qgroundcontrol 问题 xff1a 解锁过程中提示 Flying with usb is not safe xff0
  • 使用无线数传 radio telemetry 连接pixhawk进入offboard模式进行mavlink协议通讯的尝试

    环境 xff1a Windows电脑一台 Linux电脑一台 Radio telemetry 收发两端 Pixhawk 2 4 6飞控 USB micro 连接线 软件 xff1a PX4固件 QGroundcontrol 地面站 mavl
  • ROS学习笔记(四)ros 无法rosdep init 或者update解决方法

    如果提示的是 ERROR unable to process source https raw githubusercontent com ros rosdistro master rosdep xxxxx 之类的错误 xff0c 同时保证
  • ROS学习笔记(十二)ROS noetic ubuntu20.04 版本 rosdep init,rosdep update 问题解决方法

    ROS1 noetic 版本在ubuntu20 04安装出现问题 xff0c rosdep update无法下载 xff0c 网络地址访问超时 ROS1 noetic 版本在ubuntu20 04系统上的安装方法见博客 xff1a Ubun
  • FreeRTOS之xTaskCreate()

    xTaskCreate 函数解析 task span class token punctuation span h BaseType t span class token function xTaskCreate span span cla
  • 解决笔记本双USB接口散热器无法给其他外接设备供电的问题

    问题描述 xff1a 有个双usb接口的笔记本散热器 xff0c 之前是散热器接笔记本的一个usb接口 xff0c 连接到散热器的一个USB接口上 xff0c 散热器上的另一个usb接口可以连其他设备 xff0c 比如外界键盘 出现了问题
  • FreeRTOS之vTaskDelete()

    vTaskDelete 函数解析 task span class token punctuation span h span class token keyword void span span class token function v
  • MobaXterm连接不上虚拟机linux的问题

    目录 问题描述 xff1a step1 进入centOS下的 etc sysconfig network scripts step2 输入命令vi ifcfg ens33 查看并编辑该文件 step3 将文件中的 step4 重启网络服务
  • Linux LVM root分区 磁盘扩容

    LVM 的基本概念 物理卷 Physical Volume PV xff1a 可以在上面建立卷组的媒介 xff0c 可以是硬盘分区 xff0c 也可以是硬盘本身或者 回环文件 xff08 loopback file xff09 物理卷包括一
  • 浅尝树莓派3之串口配置

    树莓派3硬件串口的使用及编程 发表于 2017 01 29 分类于 树莓派 暂无评论 阅读次数 54 引言 本文转载自 xff1a http etrd org 2017 01 29 E6 A0 91 E8 8E 93 E6 B4 BE3 E
  • Android开发必备——注解

    前言 阅读官方源码以及各类第三方框架时可以发现 xff0c 很多地方都有注解 xff0c 作为一名Android程序员 xff0c 掌握注解属于必不可少的一项技能 1 什么是注解 注解是以 64 符号开头的用来标识如类 字段 方法等的工具
  • ROS 'catkin_make' 命令出错

    之前 xff0c 我在自己的电脑上 xff08 新安装的ubuntu16 04 xff09 装好了ROS xff0c 用catkin make编译成功了 xff0c 但是用一样的方法在实验室的电脑上编译就报错 xff0c 后来发现和之前装过
  • PX4 里面的TCP服务端代码

    PX4 里面的TCP服务端代码 span class token comment examples nettest nettest server c Copyright C 2007 2011 2012 Gregory Nutt All r
  • 传感器研究NO1.陀螺仪

    一 陀螺仪重要参数 如下图所示 xff0c 一般陀螺仪手册具有很多参数 xff0c 此处仅记录软件编程应注意的参数 Full Scale Range xff08 量程 xff09 xff1a dps xff08 Degree Per Sec
  • ESP8266与电脑PC端TCP通讯步骤+例子一

    我们先讲 xff0c 拿到一个ESP8266模块之后 xff0c 该做什么 我拿到这个模块之后 xff0c 一脸蒙蔽 xff0c 我不知道怎么使用 xff0c 这个时候 xff0c 不要慌 xff0c 去看技术手册 我4步让你学会最简单的使
  • 读java编程思想的一点感触

    学习一些java基础语法后 xff0c 能应付简单的日常工作 但是觉得还是得系统学习一下这门语言 xff0c 就选择了java编程思想 原书第4版 xff0c 机械工业出版社 xff0c 陈昊鹏译的这本 看懂的不是很多 xff0c 还是学到
  • linux---UDP代码通信

    udp连接特性 xff1a 无连接 xff1a 可以不构成连接就进行通信不可靠 xff1a 数据并不能保证可靠性面向数据报 xff1a 每条数据有长度限制 xff0c 整条数据发送整条数据接受 xff0c 传输不灵活 xff0c 但是不会存