相关专栏【Linux专栏】【C语言专栏】【测试专栏】 相关文章推荐【测试】一文读懂软件测试新手真正需要的测试认知【Linux】网络基础2---Socket编程预备【C语言】超实用VS调试干货新手也能轻松排错文章目录一、套接字的种类1. 流式套接字 (SOCK_STREAM)2. 数据报套接字 (SOCK_DGRAM)3. 原始套接字 (SOCK_RAW)4. Unix域套接字 (Unix Domain Socket)二、再来认识一下UDP1. 核心特性对比 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守护进程等高性能本地通信。二、再来认识一下UDPUDPUser 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.hint 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.hint 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# 如果没有安装 GCCUbuntu/Debian 用 aptCentOS 用 yumsudoaptupdatesudoaptinstallgcc-y# Ubuntu/Debian# sudo yum install gcc -y # CentOS/RedHat这里不懂的可以看前面的博客文章https://blog.csdn.net/2502_91546643/article/details/160417745?spm1011.2415.3001.10575sharefrommp_manage_link2. 创建代码文件touch先创建一个空白文件vim 文件名如果文件不存在就自动帮你新建一个空文件并直接进入编辑如果文件已存在就直接进入编辑# 创建两个文件 //这里用touchtouchudp_server.c udp_client.c3. 写入代码代码在上面#因为上面已经创建了这两个文件所以是直接进入编辑vimudp_server.cvimudp_client.c按i进入编辑模式按ESC退回命令模式在输入:wq保存退出4. 编译# 生成服务端和客户端程序gcc udp_server.c-oserver gcc udp_client.c-oclient5. 运行测试./udp_server./udp_client //这是只有一个Xhsell窗口的情况下6. 运行结果7.可能遇到的问题问题1端口被占用# 换个端口修改代码里的 8888 为其他数字如 9999# 改完重新编译问题2收不到数据# 检查防火墙云服务器安全组要放行 UDP 端口sudoufw status# 查看防火墙状态sudoufw allow8888/udp# 开放 UDP 8888 端口# 如果是云服务器阿里云/腾讯云等还需要在控制台安全组规则中放行 UDP 8888问题3想停掉后台服务端# 查找进程并杀掉psaux|grepserverkill进程ID7. 验证是否通过即上面的运行结果8. 测试脚本1创建一个test.sh文件touchtest.sh2对test.sh文件进行编辑vimtest.sh输入以下内容gcc udp_server.c-oservergcc udp_client.c-oclientecho编译成功请运行 ./server 和 ./client3赋予执行权限普通用户没有该执行权限赋予权限前赋予权限后输入chmod x test.sh
【Linux】Socket编程UDP
发布时间:2026/5/24 4:26:05
相关专栏【Linux专栏】【C语言专栏】【测试专栏】 相关文章推荐【测试】一文读懂软件测试新手真正需要的测试认知【Linux】网络基础2---Socket编程预备【C语言】超实用VS调试干货新手也能轻松排错文章目录一、套接字的种类1. 流式套接字 (SOCK_STREAM)2. 数据报套接字 (SOCK_DGRAM)3. 原始套接字 (SOCK_RAW)4. Unix域套接字 (Unix Domain Socket)二、再来认识一下UDP1. 核心特性对比 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守护进程等高性能本地通信。二、再来认识一下UDPUDPUser 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.hint 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.hint 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# 如果没有安装 GCCUbuntu/Debian 用 aptCentOS 用 yumsudoaptupdatesudoaptinstallgcc-y# Ubuntu/Debian# sudo yum install gcc -y # CentOS/RedHat这里不懂的可以看前面的博客文章https://blog.csdn.net/2502_91546643/article/details/160417745?spm1011.2415.3001.10575sharefrommp_manage_link2. 创建代码文件touch先创建一个空白文件vim 文件名如果文件不存在就自动帮你新建一个空文件并直接进入编辑如果文件已存在就直接进入编辑# 创建两个文件 //这里用touchtouchudp_server.c udp_client.c3. 写入代码代码在上面#因为上面已经创建了这两个文件所以是直接进入编辑vimudp_server.cvimudp_client.c按i进入编辑模式按ESC退回命令模式在输入:wq保存退出4. 编译# 生成服务端和客户端程序gcc udp_server.c-oserver gcc udp_client.c-oclient5. 运行测试./udp_server./udp_client //这是只有一个Xhsell窗口的情况下6. 运行结果7.可能遇到的问题问题1端口被占用# 换个端口修改代码里的 8888 为其他数字如 9999# 改完重新编译问题2收不到数据# 检查防火墙云服务器安全组要放行 UDP 端口sudoufw status# 查看防火墙状态sudoufw allow8888/udp# 开放 UDP 8888 端口# 如果是云服务器阿里云/腾讯云等还需要在控制台安全组规则中放行 UDP 8888问题3想停掉后台服务端# 查找进程并杀掉psaux|grepserverkill进程ID7. 验证是否通过即上面的运行结果8. 测试脚本1创建一个test.sh文件touchtest.sh2对test.sh文件进行编辑vimtest.sh输入以下内容gcc udp_server.c-oservergcc udp_client.c-oclientecho编译成功请运行 ./server 和 ./client3赋予执行权限普通用户没有该执行权限赋予权限前赋予权限后输入chmod x test.sh