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

【Linux】Socket编程UDP

📌 相关专栏

  • 【Linux专栏】
  • 【C语言专栏】
  • 【测试专栏】

📌 相关文章推荐

  • 【测试】一文读懂软件测试:新手真正需要的测试认知
  • 【Linux】网络基础2---Socket编程预备
  • 【C语言】超实用VS调试干货,新手也能轻松排错


文章目录

  • 一、套接字的种类
    • 1. 流式套接字 (SOCK_STREAM)
    • 2. 数据报套接字 (SOCK_DGRAM)
    • 3. 原始套接字 (SOCK_RAW)
    • 4. Unix域套接字 (Unix Domain Socket)
  • 二、再来认识一下UDP
    • 1. 核心特性(对比 TCP )
  • 三、UDP编程
    • 1. 服务端
    • 2. 客户端
    • 实施步骤
      • 1.连接并确认环境
      • 2. 创建代码文件
      • 3. 写入代码(代码在上面)
      • 4. 编译
      • 5. 运行测试
      • 6. 运行结果
      • 7.可能遇到的问题
      • 7. 验证是否通过
      • 8. 测试脚本

一、套接字的种类

1. 流式套接字 (SOCK_STREAM)

  • 协议:基于 TCP,提供面向连接、可靠的数据传输服务。
  • 特点:保证数据按顺序到达且无差错,类似打电话。适用于网页浏览、文件下载、邮件收发等对数据准确性要求高的场景。

2. 数据报套接字 (SOCK_DGRAM)

  • 协议:基于 UDP,提供无连接、不可靠的服务。
  • 特点:每个数据包独立发送,不保证顺序或可靠到达,但传输效率高。类似寄信。适用于实时性要求高的场景,如视频会议、在线游戏、DNS查询。

3. 原始套接字 (SOCK_RAW)

  • 协议:允许直接访问和操作底层协议(如IP、ICMP)。
  • 特点:可以构造自定义的数据包或读取网络上的原始数据包。主要用于网络诊断(如Ping命令)和网络安全工具开发(如Wireshark、Nmap)。

4. Unix域套接字 (Unix Domain Socket)

  • 协议:不基于TCP/UDP网络协议,专门用于同一台设备上不同进程间的通信(IPC)。
  • 特点:效率极高,比网络套接字更快。通常通过文件系统中的一个文件来表示(例如 /var/run/docker.sock)。常用于数据库(如MySQL)、Docker守护进程等高性能本地通信。

二、再来认识一下UDP

UDP(User Datagram Protocol,用户数据报协议)是 TCP 的“简单粗暴”版兄弟。用一句话概括:它是“只管发,不管到”的明信片服务。

1. 核心特性(对比 TCP )

特性UDPTCP
连接状态无连接(直接发)面向连接(先握手)
可靠性不可靠(发完就忘)可靠(确认+重传)
顺序保证不保证(可能乱序)保证按序到达
数据边界有边界(数据报)无边界(字节流)
速度快(无开销)慢(握手、确认、拥塞控制)
头部大小8 字节20-60 字节
流量控制
拥塞控制
单次发送上限约 64KB无限制(流式)

三、UDP编程

1. 服务端

所需类型:

int_sockfd;//创建套接字对应的文件描述符uint_16t _port;//端口号string _ip;//服务端的IP地址 bind 0 表示绑定任意地址bool _isrunning;//判断服务端是否在进行

示例:最简单的UDP服务端(接收数据并回显
这里我用的是xshell

//udp_server.c#include <stdio.h>#include <string.h>#include <arpa/inet.h>int main(){int sockfd = socket(AF_INET,SOCK_DGRAM,0);struct sockaddr_in addr ={.sin_family = AF_INET,.sin_port = htons(8888),.sin_addr.s_addr = INADDR_ANY};bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));char buf[1024];struct sockaddr_in client_addr;socklen_t len = sizeof(client_addr);recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&client_addr,&len);printf("收到: %s\n",buf);sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&client_addr,len);close(sockfd);return0;}

2. 客户端

//client.c#include <stdio.h>#include <string.h>#include <arpa/inet.h>int main(){int sockfd = socket(AF_INET,SOCK_DGRAM,0);struct sockaddr_in server_addr ={.sin_family = AF_INET,.sin_port = htons(8888)};inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr);char*msg ="Hello UDP";sendto(sockfd,msg,strlen(msg),0,(struct sockaddr*)&server_addr,sizeof(server_addr));char buf[1024];socklen_t len = sizeof(server_addr);recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&server_addr,&len);printf("收到回复: %s\n",buf);close(sockfd);return0;}

实施步骤

1.连接并确认环境

# 连上后确认 GCC 是否安装gcc--version# 如果没有,安装 GCC(Ubuntu/Debian 用 apt,CentOS 用 yum)sudoaptupdate&&sudoaptinstallgcc-y# Ubuntu/Debian# sudo yum install gcc -y # CentOS/RedHat

这里不懂的可以看前面的博客文章:https://blog.csdn.net/2502_91546643/article/details/160417745?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

2. 创建代码文件

  • touch:先创建一个空白文件
  • vim 文件名:
    • 如果文件不存在,就自动帮你新建一个空文件,并直接进入编辑;
    • 如果文件已存在,就直接进入编辑
# 创建两个文件 //这里用touchtouchudp_server.c udp_client.c

3. 写入代码(代码在上面)

#因为上面已经创建了这两个文件,所以是直接进入编辑vimudp_server.cvimudp_client.c

i进入编辑模式,按ESC退回命令模式,在输入:wq保存退出

4. 编译

# 生成服务端和客户端程序gcc udp_server.c-oserver gcc udp_client.c-oclient

5. 运行测试

./udp_server&./udp_client //这是只有一个Xhsell窗口的情况下

6. 运行结果

7.可能遇到的问题

问题1:端口被占用

# 换个端口,修改代码里的 8888 为其他数字(如 9999)# 改完重新编译

问题2:收不到数据

# 检查防火墙(云服务器安全组要放行 UDP 端口)sudoufw status# 查看防火墙状态sudoufw allow8888/udp# 开放 UDP 8888 端口# 如果是云服务器(阿里云/腾讯云等),还需要在控制台安全组规则中放行 UDP 8888

问题3:想停掉后台服务端

# 查找进程并杀掉psaux|grepserverkill<进程ID>

7. 验证是否通过

即上面的运行结果:

8. 测试脚本

(1)创建一个test.sh文件

touchtest.sh

(2)对test.sh文件进行编辑:

vimtest.sh

输入以下内容:

gcc udp_server.c-oserver&&gcc udp_client.c-oclientecho"编译成功,请运行 ./server 和 ./client"

(3)赋予执行权限(普通用户没有该执行权限)
赋予权限前:

赋予权限后:输入chmod +x test.sh

http://www.jsqmd.com/news/868635/

相关文章:

  • 如何快速安装TrollStore:iOS 14-16.6.1设备一键安装的终极指南
  • 水性聚氨酯砂浆厂家推荐:2026水性聚氨酯砂浆定制供应商口碑实力推荐 - 栗子测评
  • 设计模式系列文章(基础篇第 1 篇):初识设计模式——从重复踩坑到优雅编码
  • 从Python到微调:6个月小白也能掌握的大模型应用开发路线图(收藏版)
  • 6G时代下的语义通信:重塑信息交互的未来图景
  • 29个月未修!Google意外泄露Chromium永久驻留漏洞:浏览器秒变JS僵尸网络
  • MySQL 部门表:树结构 (自关联) vs 非树结构 (扁平化 / 冗余字段)
  • 二叉搜索树(BST)详解
  • cann-learning-hub - 昇腾CANN学习资源一站式指南
  • 2026年最严重终端安全事件:Microsoft Defender双零日漏洞深度解析与防御实战
  • 【即插即用完整代码】AAAI 2026 “一看就懂,先扫后察”大模型让视频异常无处遁形!
  • H3CSE 高性能园区网:生成树保护机制
  • 兄弟反目成仇?《易经》深挖人性:猜疑才是最大祸根
  • 论文修改踩坑无数?paperxie 帮你一站式搞定查重与 AIGC 降重难题
  • 跨国零售企业网络升级实践:如何打通全球零售网络
  • SQL注入入门篇 小白 新手逻辑讲解 主流四步 简单易懂
  • ElevenLabs广西话输出突然失真?一文定位3类隐藏错误:声母浊化丢失、入声韵尾截断、连读变调失效
  • 从存储革命到计算革命:eMRAM存算一体芯片的现状、迷思与终极蓝图
  • H3CSE 高性能园区网:Smart Link 与 Monitor Link 技术详解
  • CAN一致性-物理层--高压通信范围测试
  • CI算法详解
  • 【最新源码】JewelryShop商城系统设计c123
  • 数据库局部变量,全局变量,流程控制
  • 为什么你的ElevenLabs江苏话输出总像“普通话+口音”?揭秘吴语连读变调(sandhi)缺失的4个隐藏参数及patch级修复方案
  • 【YOLO目标检测全栈实战】65 让YOLO开口说话:YOLO-World + 多模态大模型的端到端对话系统实战
  • WebView 被注入的隐形炸弹——远程代码执行漏洞与安全硬核加固指南
  • 终极Figma中文界面改造指南:3分钟让英文设计工具变身母语助手
  • 倚天剑术58--给PDF文件盖电子章
  • DevOps 生态介绍(五):玩转SonarQube:代码静态扫描、Bug预警、质量门禁介绍
  • 【NotebookLM效应量计算实战指南】:20年统计学专家亲授3大避坑法则与5步精准计算流程