Socket网络编程:TCP与UDP
文章目录一、Socket网络编程的原理1.TCPTCP Socket编程核心流程(经典C/S架构)2.UDP3.通用步骤4.函数详解(1)创建Socketsocket() —— 创建“电话机”(2)绑定地址bind() —— 给电话机“绑定号码”服务器必须做(3)监听连接请求listen() [仅适用于TCP] —— 将电话机设为“待机接听”状态(4)接受连接accept() —— 从队列里“拿起”一个来电(5)发起连接connect() [仅适用于TCP客户端] —— 客户端“拨号”连接(6)发送数据send() 或write()—— 通话发送/写数据(7)接收数据revc() 或 read()—— 通话接收/读数据(8)关闭Socket连接close() —— 挂断电话二、socket 套接字三、多线程四、IO模型1.阻塞式IO模型2.非阻塞式IO模型3.IO多路复用五、select、poll、epoll1.select2.poll3.epoll4.三者对比六、Redis一、Socket网络编程的原理1.TCPTCP Socket编程核心流程(经典C/S架构)TCP 编程遵循“服务器被动等待客户端主动连接”的模式。流程图如下服务器端socket()→bind()→listen()→accept()阻塞→recv()/send()→close()客户端socket()→connect()发起握手→send()/recv()→close()2.UDP3.通用步骤①创建Socketsocket()②绑定地址bind()③监听连接请求listen()④接受连接accept()⑤发起连接connect()⑥发送数据send()、接收数据revc()⑦关闭连接close()4.函数详解(1)创建Socketsocket() —— 创建“电话机”intsockfdsocket(AF_INET,SOCK_STREAM,0);AF_INET表示使用 IPv4 协议。SOCK_STREAM表示使用面向连接的字节流即 TCP。返回值是一个文件描述符Linux 下一切皆文件后续操作都基于这个 fd。#includesys/socket.hintsocket(intdomain,inttype,intprotocol);作用创建一个新的Socket。参数domain指定通信协议族如AF_INETIPv4或AF_INET6IPv6。type指定Socket的类型如SOCK_STREAMTCP或SOCK_DGRAMUDP。protocol指定协议通常为0表示使用默认协议。返回值成功返回Socket描述符失败返回-1。1.参数intsocket(intaddress_family,inttype,intprotocol);(1)address family①AF_INETIPv4 网络协议。用于TCP/IP和UDP/IP网络通信。②AF_INET6IPv6 网络协议。用于TCP/IP和UDP/IP网络通信但支持IPv6地址。③AF_UNIX或AF_LOCAL本地通道通信。用于在同一台机器上的进程间通信。2)type①SOCK_STREAMTCP协议提供面向连接的稳定数据传输保证数据能够按顺序、完整地到达。②SOCK_DGRAMUDP协议提供无连接的数据传输服务。发送的是独立的消息不保证顺序或数据完整性。③SOCK_RAW提供原始网络协议访问。在网络模型中这种类型的套接字允许直接访问IP层通常用于网络协议的开发和测试。(3)protocol默认协议填02.返回值①成功时socket() 返回一个非负整数即新创建的套接字文件描述符。②出错时返回 -1并设置全局变量 errno 以表示具体的错误类型。3.创建一个使用IPv4地址和TCP协议的套接字intsockfdsocket(AF_INET,SOCK_STREAM,0);if(sockfd-1){perror(socket creation failed);}这里AF_INET 指定使用IPv4地址SOCK_STREAM 指定使用面向连接的数据传输方式(TCP)0 表示自动选择使用TCP协议。(2)绑定地址bind() —— 给电话机“绑定号码”服务器必须做bind(sockfd,(structsockaddr*)serv_addr,sizeof(serv_addr));将服务器的 IP 地址和端口号绑定到 socket 上。客户端需要知道这个 IP 和端口才能找到你#includesys/socket.hintbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);作用将Socket绑定到一个地址。参数sockfdSocket描述符。addr指向要绑定的地址结构的指针。addrlen地址结构的长度。返回值成功返回0失败返回-1。(3)监听连接请求listen() [仅适用于TCP] —— 将电话机设为“待机接听”状态listen(sockfd,BACKLOG);将主动 socket 转变为被动监听 socketBACKLOG 是已完成三次握手的连接队列的最大长度注意不是最大并发数#includesys/socket.hintlisten(intsockfd,intbacklog);作用开始监听连接请求。参数sockfdSocket描述符。backlog等待连接队列的最大长度。返回值成功返回0失败返回-1。(4)接受连接accept() —— 从队列里“拿起”一个来电intclient_fdaccept(sockfd,(structsockaddr*)client_addr,addrlen);这是一个阻塞函数。如果没有客户端连接程序会停在这里。重要区分sockfd 是监听套接字只负责接听client_fd 是通信套接字负责收发数据。在高并发服务器中这个 client_fd 通常会被交给子线程或子进程去处理。#includesys/socket.hintaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);作用接受客户端的连接请求。参数sockfdSocket描述符。addr用于存储客户端地址信息的结构体指针。addrlen客户端地址结构体的长度。返回值成功返回一个新的Socket描述符失败返回-1。(5)发起连接connect() [仅适用于TCP客户端] —— 客户端“拨号”连接connect(sockfd,(structsockaddr*)serv_addr,sizeof(serv_addr));客户端调用此函数发起三次握手连接成功返回 0失败返回 -1#includesys/socket.hintconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);作用TCP客户端向服务器端发起连接请求。参数sockfdSocket描述符。addr指向服务器端地址结构的指针。addrlen地址结构的长度。返回值成功返回0失败返回-1。#includesys/types.h#includesys/socket.hintconnect(intsockfd,conststructsockaddr*addr,socklen_t addrlen);connect()成功返回0失败返回-1以下是一个简单的 TCP 客户端示例展示了如何使用 connect() 连接到服务器#includestdio.h#includestring.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.hintmain(){intsockfdsocket(AF_INET,SOCK_STREAM,0);if(sockfd0){perror(Socket creation failed);return-1;}structsockaddr_inserver_addr;memset(server_addr,0,sizeof(server_addr));server_addr.sin_familyAF_INET;server_addr.sin_porthtons(12345);// 服务器监听的端口inet_pton(AF_INET,192.168.1.100,server_addr.sin_addr);// 服务器的IP地址if(connect(sockfd,(structsockaddr*)server_addr,sizeof(server_addr))0){perror(Connection failed);return-1;}printf(Connected to the server\n);// 之后可以使用sockfd进行数据传输close(sockfd);// 关闭套接字return0;}在这个示例中客户端程序创建了一个套接字设置服务器的 IP 地址和端口然后尝试与服务器建立连接。如果 connect() 调用成功客户端就与服务器建立了连接并可以通过该套接字进行数据通信。(6)发送数据send() 或write()—— 通话发送/写数据send(client_fd,buffer,len,0);#includesys/types.h#includesys/socket.hssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);作用发送数据。参数sockfdSocket描述符。buf指向要发送数据的缓冲区。len要发送的数据长度。flags传输控制标志通常为0。返回值成功返回发送的字节数失败返回-1发送数据将数据放到发送缓冲区。由内核决定什么时候将数据发送出去。(7)接收数据revc() 或 read()—— 通话接收/读数据recv(client_fd,buffer,sizeof(buffer),0);收发数据。recv 默认是阻塞的会一直等待数据到来。#includesys/types.h#includesys/socket.hssize_trecv(intsockfd,void*buf,size_tlen,intflags);作用接收数据。参数sockfdSocket描述符。buf用于存储接收数据的缓冲区。len缓冲区的大小。flags接收控制标志通常为0。返回值成功返回接收的字节数失败返回-1。接收数据当数据送到Linux内核后数据不是立即给到应用程序而是放在接收缓冲区等应用程序什么时候调用recv()函数什么时候才由内核给到应用程序。(8)关闭Socket连接close() —— 挂断电话close(client_fd);close(sockfd);关闭套接字释放资源。关闭通信套接字会触发 TCP 四次挥手。#includeunistd.hintclose(intsockfd);作用关闭Socket连接。参数sockfdSocket描述符。返回值成功返回0失败返回-1。二、socket 套接字socket套接字(IP:port)①IP用来定位是哪台电脑端口号用来定位是哪个进程②socket_fd 是 int类型的数字故套接字socket可理解为一套用于连接的数字三、多线程多线程的弊端需要CPU上下文切换四、IO模型1.阻塞式IO模型就等着你反馈。程序查询方式(独占查询)2.非阻塞式IO模型轮询检查程序查询方式(定时查询)3.IO多路复用1.定义IO多路复用是一种同步IO模型。①IO操作系统中数据在用户态和内核态之间的读写操作②多路多个TCP连接 (多个socket)③复用一个或多个线程资源④IO多路复用一个或多个线程处理多个TCP连接2.作用利用IO多路复用可以实现一个线程监控多个文件句柄。3.IO多路复用的使用场景要设计一个高性能的网络服务器。这个高性能服务器可以供多个客户端同时连接并且能处理这些客户端传上来的请求。4.实现IO多路复用的三种模型①select②poll③epoll对于待检测集合select和poll是基于线性方式处理的epoll是基于红黑树来管理待检测集合的。select和poll每次都会线性扫描整个待检测集合集合越大速度越慢epoll使用的是回调机制效率高处理效率也不会随着检测集合的变大而下降腾讯面试请描述select、poll、epoll这三种多路复用技术的原理IO多路复用之epollC语言实现QQ聊天室小项目 [完整源码]Linux网络编程基础及多线程并发案例好文推荐Linux IO模式及 select、poll、epoll详解五、select、poll、epoll1.select1.原理select采用轮询 遍历方式遍历bitmap将需要监听的文件描述符置1不需要监听的文件描述符置0三种fd写描述符、读描述符、异常描述符select会监视这三种文件描述符当数据可读/可写/异常/超时 时会返回。返回后通过遍历fdset(文件描述符的集合)来找到就绪的fd去触发相应的IO操作。2.优点3.缺点①文件描述表为bitmap结构长度最大为1024②fdset不可重用每次循环遍历都得重新创建③频繁的用户态和内核态拷贝性能开销较大④需要对文件描述符表进行遍历轮询时间复杂度为O(n)4.代码5.模型演示2.poll1.原理poll也是采用轮询 遍历方式但poll采用的是链表方式来存储fd2.优缺点3.代码//pollfd结构体原型structpollfd{intfd;//文件描述符shortevents;//注册的事件,用户关注的事件,如读写事件shortrevents;//实际发生的事件,由内核填充。系统内核填充并返回的事件};4.模型演示3.epollepoll模型是为了高效地处理大量并发连接1.原理epoll采用事件通知机制将轮询改成了回调。epoll的底层数据结构是红黑树 双向链表。①epoll_create()在系统启动时在Linux内核中申请一个红黑树结构的文件系统再返回epoll对象(fd对象)②epoll_ctl()创建客户端和服务器端的连接并把连接注册到eventpoll中。在每新建一个连接的时候同步更新epoll对象中的fd并绑定一个callback()回调函数。通过 epoll_ctl() 将 sockfd 添加到 epfd 的监控列表中并指定我们感兴趣的事件是 EPOLLIN即套接字可读通常表示有新的连接请求。这样当 sockfd 上发生了 EPOLLIN 事件时epoll_wait() 将能够检测到这一事件。③epoll_wait()检查双向链表list中是否有已就绪的事件若有则立刻返回不阻塞为空则阻塞等待。轮询所有的callback集合并触发对应的IO操作。分布式系统中常用的组件Redis、Nginx都采用epoll模型2.优缺点3.代码4.模型演示4.三者对比selectpollepoll六、RedisRedis为什么这么快①内存②单线程③IO多路复用④内部数据结构

相关新闻

Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验

Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验

Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/b…

2026/10/17 18:03:37 阅读更多 →
League Akari:3步掌握英雄联盟终极自动化助手

League Akari:3步掌握英雄联盟终极自动化助手

League Akari:3步掌握英雄联盟终极自动化助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄选择阶段犹豫不决&…

2026/10/20 19:34:50 阅读更多 →
linux网络文件共享服务 - Samba详解

linux网络文件共享服务 - Samba详解

目录一、samba简介二、Samba组成三、服务端smb.conf配置说明四、搭建samba共享服务1、关闭防火墙,关闭selunix2、安装 Samba:3、创建 Samba 用户:4、创建共享目录:5、启动 Samba 服务:6、添加防火墙规则:一…

2026/10/18 10:31:23 阅读更多 →

最新新闻

贾子猜想与 AI 智慧级别的自我定位| Kucius Conjecture and AI‘s Self-Positioning on the Wisdom Scale

贾子猜想与 AI 智慧级别的自我定位| Kucius Conjecture and AI‘s Self-Positioning on the Wisdom Scale

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:27:04 阅读更多 →
通达信行情拉取总是超时?用 mootdx 三步拿到 A 股数据

通达信行情拉取总是超时?用 mootdx 三步拿到 A 股数据

通达信行情拉取总是超时?用 mootdx 三步拿到 A 股数据 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 上个月排查一个通达信日线脚本:第一轮报 ConnectionError: timed out…

2026/10/21 1:27:04 阅读更多 →
Python UDP信息传输实战:从核心原理到收发系统搭建与避坑指南

Python UDP信息传输实战:从核心原理到收发系统搭建与避坑指南

UDP这玩意儿,说简单也简单,几行代码就能把数据甩出去;说坑也多,第一次用它做信息传输的人,十个里有八个会卡在"为什么服务端收不到数据"或者"为什么中文变成乱码"上。我自己最早接触socket编程是在…

2026/10/21 1:27:04 阅读更多 →
SiC MOSFET选型陷阱:别再只看毫欧,电压等级才是系统应力刻度尺

SiC MOSFET选型陷阱:别再只看毫欧,电压等级才是系统应力刻度尺

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:27:04 阅读更多 →
蓝牙防丢器Android源码解析:经典蓝牙SPP打通搜索连接到断开报警

蓝牙防丢器Android源码解析:经典蓝牙SPP打通搜索连接到断开报警

简介:一份针对蓝牙防丢器APP开发的完整源码工程,面向需要学习BLE蓝牙通信与Android APP开发的初学者或进阶者。资源核心为BLEDemo3项目,涵盖设备扫描、连接管理、命令发送、事件响应及用户界面等模块,并基于Eclipse ADT环境构建&a…

2026/10/21 1:27:04 阅读更多 →
永磁同步电机MTPA+弱磁+前馈补偿双闭环控制仿真解析

永磁同步电机MTPA+弱磁+前馈补偿双闭环控制仿真解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:26:01 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →