【C++网络编程】(二)Linux平台下UDP客户/服务端程序

Linux平台下UDP客户/服务端程序

图片来源:https://subingwen.cn/linux/udp/

在这里插入图片描述

UDP服务器无法直接检测客户端断开连接。

UDP 服务端

server.cpp

#include <iostream>
#include <cstdlib>      // std::exit
#include <cstring>      // memset
#include <arpa/inet.h>  // socket, bind, recvfrom, sendto,SOCK_DGRAM
#include <unistd.h>     // close

int main()
{
    // 1. 创建 UDP 套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);  // 创建一个UDP套接字
    if (sockfd == -1)
    {
        perror("socket");  // 错误处理
        std::exit(EXIT_FAILURE);
    }

    // 2. 将socket()返回值和本地的IP端口绑定到一起
    sockaddr_in addr;                     // 用于存储地址信息
    addr.sin_family = AF_INET;            // 地址族,IPv4
    addr.sin_port = htons(10000);         // 转换服务器的端口号10000为网络字节序
    addr.sin_addr.s_addr = INADDR_ANY;    // 绑定到任意IP地址
    // inet_pton(AF_INET, "172.31.108.107", &addr.sin_addr.s_addr); // 指定IP地址

    int ret = bind(sockfd, (sockaddr*)&addr, sizeof(addr)); // 绑定套接字到地址
    if (ret == -1)
    {
        perror("bind");  // 错误处理
        std::exit(EXIT_FAILURE);
    }

    // 3. 和客户端通信
    while (true)
    {
        char buf[1024];  // 接收缓冲区
        memset(buf, 0, sizeof(buf));  // 清零缓冲区
        
        sockaddr_in cliaddr;           // 用于存储客户端地址信息
        socklen_t clilen = sizeof(cliaddr); // 客户端地址结构的大小
        
        // 接收数据
        int len = recvfrom(sockfd, buf, sizeof(buf), 0, (sockaddr*)&cliaddr, &clilen); // 从客户端读取数据
        if (len > 0)
        {
            std::cout << "客户端: " << buf << std::endl;  // 打印客户端发送的消息

            // 回复客户端
            std::string response = "你好, 客户端...\n";
            sendto(sockfd, response.c_str(), response.size(), 0, (sockaddr*)&cliaddr, clilen); // 发送响应
        }
        else
        {
            perror("recvfrom");  // 错误处理
            break;
        }
    }

    close(sockfd);  // 关闭UDP套接字

    return 0;
}

编译与运行

g++ server.cpp -o server
./server

UDP 客户端

client.cpp

#include <iostream>
#include <cstdlib>      // std::exit
#include <cstring>      // memset, strlen
#include <arpa/inet.h>  // socket, sendto, recvfrom, inet_pton, htons
#include <unistd.h>     // close, sleep

int main()
{
    // 1. 创建通信的套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);  // 创建一个UDP套接字
    if (sockfd == -1)
    {
        perror("socket");  // 错误处理
        std::exit(EXIT_FAILURE);
    }

    // 2. 准备服务器地址信息
    sockaddr_in addr;               // 用于存储服务器地址信息
    addr.sin_family = AF_INET;      // 地址族,IPv4
    addr.sin_port = htons(10000);   // 大端端口转换
    inet_pton(AF_INET, "172.31.108.107", &addr.sin_addr.s_addr); // 将IP地址转换为网络字节顺序

    // 3. 和服务器端通信
    int number = 0;
    while (true)
    {
        // 发送数据
        char buf[1024];                 // 数据缓冲区
        sprintf(buf, "你好, 服务器...\n", number++);  // 格式化字符串
        sendto(sockfd, buf, strlen(buf), 0, (sockaddr*)&addr, sizeof(addr));  // 发送数据
        
        // 接收数据
        memset(buf, 0, sizeof(buf));  // 清空缓冲区
        sockaddr_in recv_addr;         // 用于存储服务器地址信息
        socklen_t addr_len = sizeof(recv_addr);
        int len = recvfrom(sockfd, buf, sizeof(buf), 0, (sockaddr*)&recv_addr, &addr_len);  // 从服务器读取数据
        if (len > 0)
        {
            std::cout << "服务器: " << buf;   // 打印服务器发送的消息
        }
        else
        {
            perror("recvfrom"); 
            break;
        }
        sleep(1);   // 每隔1秒发送一条数据
    }

    close(sockfd);  // 关闭套接字

    return 0;
}

编译与运行

g++ client.cpp -o client
./client

相关头文件介绍

使用到的函数和宏除了<sys/socket.h>recvfromsendtoSOCK_DGRAM,其他使用到的函数和宏与TCP网络通信中的基本一致。

<sys/socket.h>

  • bytes_sent = recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);:用于接收数据报文,适用于无连接的套接字(如 UDP)。它允许从任何源地址接收数据。成功时返回接收到的字节数,失败时返回 -1。 参数:

    • sockfd:接收数据的套接字描述符。
    • buf:指向接收数据的缓冲区。
    • len:缓冲区的长度,表示最大接收字节数。
    • flags:接收选项的标志,通常为 0
    • src_addr:指向 sockaddr 结构体的指针,用于存储发送方的地址信息。
    • addrlen:指向 socklen_t 类型的指针,表示 src_addr 结构体的长度。
  • bytes_sent = sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen):用于发送数据报文,适用于无连接的套接字(如 UDP)。它允许将数据发送到指定的目标地址。成功时返回实际发送的字节数,失败时返回 -1。 参数:

    • sockfd:发送数据的套接字描述符。
    • buf:指向要发送数据的缓冲区。
    • len:要发送的字节数。
    • flags:发送选项的标志,通常为 0
    • dest_addr:指向目标地址的 sockaddr 结构体。
    • addrlen:目标地址的长度。
  • SOCK_DGRAM:用于创建数据报套接字,表示使用无连接的 UDP 协议进行数据传输。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】单链表探秘:解锁数据结构中的灵动链条

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 一.单链表初探&#xff1a;构建数据结构的基石 1.1 单链表的概念及结构 1.2 节点的理解 1.3 链表的性质 二.单链表的作用&#xff1a;为何它是数据处理的优选 2.1 动态内存管理&#xff1a;内存世界的魔术师 2.2 高效的…

篇章九 【NPM】包管理工具

文章目录 一、认识NPM二、npm 镜像的设置与查看三、安装 NPM 工具1. 下载Node.js安装包2. 打开下载好的安装程序&#xff0c;点击下一步3. 选择接受许可协议&#xff0c;点击下一步4. 选择自己的安装路径&#xff08;默认是c盘&#xff09;&#xff0c;选择完成后&#xff0c;点…

喜讯AAA级!国信华源荣获全国水利建设信息化3A级信用

近日&#xff0c;中国水利工程协会发布了《2024年度水利建设市场主体&#xff08;供货、信息化单位&#xff09;信用评价结果公示》&#xff0c;国信华源荣获2024年度全国水利建设信息化单位AAA级信用评价。这一荣誉不仅是对国信华源在水利建设领域信息化能力和诚信经营的肯定&…

中波长线天线耦合的一个方法

围绕窗外墙外牵了10米的室外天线。 短波&#xff0c;fm都是很简单&#xff0c;一个夹子直接夹在拉杆天线上面&#xff0c;效果已经很好。 今天偶尔听到中波前面大约510khz的地方有个摩尔斯码。是成都附近机场的NDB。这个平时要在楼顶或者很空旷的地方才能收到。音量比较小&am…

vue2项目 实现上边两个下拉框,下边一个输入框 输入框内显示的值为[“第一个下拉框选中值“ -- “第二个下拉框选中的值“]

效果: 思路: 采用vue中 [computed:] 派生属性的方式实现联动效果,上边两个切换时,下边的跟随变动 demo代码: <template><div><!-- 第一个下拉框 --><select v-model"firstValue"><option v-for"option in options" :key&q…

神经网络中使用的激活函数有什么用?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; &#x1f50d;【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&am…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

Git推送被拒

今天开发完成一个新的需求&#xff0c;将自己的分支合并到test分支后&#xff0c;推送到远程仓库&#xff0c;结果显示推送被拒&#xff1a; 原因是因为有人更新了test分支的代码&#xff0c;我在合并之前没有拉取最新的test分支代码&#xff0c;所以他提示我“推送前需要合并…

Steinberg VST Live Pro v2.1.1 演出音频灯光控制软件

现场演出音频视频灯光控制软件 Steinberg VST Live Pro 将让现场表演更轻松。这是一款独特、稳定的软件解决方案&#xff0c;专为想要进行精彩表演的音乐家而设计&#xff0c;无论身在何处都能使用声音、灯光和视频等相关功能。VST Live附带大量虚拟乐器&#xff0c;音乐同步功…

STM32学习--4-1 OLED显示屏

接线图 OLED.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引脚初始化*/ void …

(27)QPSK信号在非相关平坦莱斯(Rician)衰落信道上的误码率性能MATLAB仿真

文章目录 前言一、Rician衰落信道模型的MATLAB代码二、在非相关的平坦Rician衰落信道上传输QPSK符号模型1.MATLAB仿真代码2.仿真结果 前言 本文首先给出莱斯衰落信道的建模函数&#xff0c;然后基于该函数给出在非相关的平坦Rician衰落信道上传输QPSK数字调制符号的MATLAB仿真…

iTOP-3A5000主控板龙芯自主指令系统外加机箱就是一台电脑主机

性能强采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。桥片采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&…

qt页面设计

1. Designer 设计师&#xff08;掌握&#xff09; Designer是Qt内置的一款界面设计程序&#xff0c;设计的界面文件为.ui格式。 C程序员通常不会单独启动Designer&#xff0c;如果要在项目中使用Designer程序&#xff0c;只需要在新建项目时&#xff0c;勾选“创建界面文件”选…

【关系模型】关系完整性约束

按照上面的框架我们已经讲了关系数据结构还有关系操作&#xff0c;今天来补充这一章的关系完整性约束 关系完整性约束 完整性约束 完整性约束可以保证数据的一致性和元组的唯一性 实体完整性约束 比如在学生表中&#xff0c;每一个元组都应该是唯一并且元组之间是可以区分…

【游戏模组】极品飞车12无间风云冬季mod,冬天版本的无间风云你体验过吗

各位好&#xff0c;今天小编给大家带来一款新的高清重置魔改MOD&#xff0c;本次高清重置的游戏叫《极品飞车12无间风云》。 《极品飞车12&#xff1a;无间风云》是由Black Box游戏制作室开发的竞速类游戏&#xff0c;于2008年11月18日在北美首发、2008年11月21日在欧洲先后推…

Java基础:面向对象编程7

1 Java 不可变对象 1.1 什么是不可变类 定义&#xff1a;一个类的对象在通过构造方法创建后&#xff0c;其状态&#xff08;成员变量值&#xff09;不会再被改变&#xff0c;这样的类称为不可变&#xff08;immutable&#xff09;类。特点&#xff1a; 所有成员变量的赋值仅在…

生成 Excel 表列名称

Excel 大家都用过&#xff0c;它的列名是用字母编号的&#xff0c;A 表示第一列&#xff0c;B 表示第二列&#xff0c;AA 表示第27列&#xff0c;AB 表示第28列等等。 现给定一个数字&#xff0c;如何得到列名称呢。比如输入28&#xff0c;输出 AB。 一开始以为就是一个简单的…

2017年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI体系结构数据包的逐层封装 应用层发送的400B数据称为应用层协议数据单元&#xff0c;也就是题目所说的PDU&#xff0c; 表示层将应用层发过来的PDU添加一个20B的首部&#xff0c;封装称为表示层PDU&#xff0c;并将其交付给会话层&#…

接口测试(一)基础

一、http请求格式 请求&#xff1a;从客户端到服务端的请求消息 请求消息格式 请求行&#xff1a;请求方法、请求URL、HTTP协议及版本 URL的一般形式为<协议>://<主机>:<端口>/<路径>/<文件名>请求头部空一行请求体 请求方法 请求方法get请求…

HCIP——以太网交换安全(四)DHCP Snooping

目录 一、DHCP Snooping的知识点 二、DHCP Snooping实验拓扑 三、总结 一、DHCP Snooping的知识点 1.1、DHCP snooping 概述&#xff1a; ①DHCP Snooping使能DHCP的一种安全特性&#xff0c;用于保证DHCP客户端从合法的DHCP服务端获取IP地址。DHCP服务器记录DHCP客户端IP…