news 2026/4/14 19:50:57

【Linux】 Linux网络编程入门:Soket编程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】 Linux网络编程入门:Soket编程详解

【Linux】Linux 网络编程入门:Socket 编程详解

Socket 是 Linux(以及几乎所有类 Unix 系统)网络编程的基石。
掌握 Socket 编程,是理解网络通信、服务器开发、分布式系统、微服务通信的基础。

本文从零开始,逐步带你理解Socket 的本质 → 基本 API → 完整 TCP 服务器/客户端 → 常见模型,适合初学者快速上手,也适合有一定基础的人查漏补缺。

1. Socket 是什么?(最核心的概念)

一句话总结:

Socket 是操作系统提供的一种抽象,用于在不同主机(或同一主机不同进程)之间进行双向通信。

它本质上是内核中一段通信端点的描述,包含:

  • 协议族(IPv4 / IPv6 / Unix Domain)
  • 传输层协议(TCP / UDP)
  • IP 地址
  • 端口号

在 Linux 中,Socket 是一个文件描述符(fd),可以用read/write/close等系统调用操作。

2. Socket 编程核心 API 一览表

分类函数原型作用常见参数说明返回值含义
创建socket(int domain, int type, int protocol)创建 socketdomain: AF_INET / AF_INET6 / AF_UNIX≥0:文件描述符,-1:失败
绑定bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)给 socket 绑定 IP + 端口0 成功,-1 失败
监听listen(int sockfd, int backlog)设置被动监听(服务器)backlog:半连接队列长度建议值0 成功,-1 失败
接受连接accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)接受客户端连接,返回新连接 fdaddr 用于返回客户端地址≥0:新连接 fd,-1:失败
连接connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)客户端主动发起连接0 成功,-1 失败
发送数据send(int sockfd, const void *buf, size_t len, int flags)发送数据flags:常用 0 / MSG_DONTWAIT / MSG_NOSIGNAL>0:发送字节数,0:连接关闭,-1:错误
接收数据recv(int sockfd, void *buf, size_t len, int flags)接收数据>0:接收字节数,0:对方关闭,-1:错误
关闭close(int sockfd)关闭 socket0 成功,-1 失败

3. TCP 服务器完整示例(最经典的写法)

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#definePORT8888#defineBACKLOG128#defineBUF_SIZE1024intmain(){intserver_fd,client_fd;structsockaddr_inserver_addr,client_addr;socklen_tclient_len=sizeof(client_addr);charbuffer[BUF_SIZE];// 1. 创建 socketserver_fd=socket(AF_INET,SOCK_STREAM,0);if(server_fd==-1){perror("socket failed");exit(EXIT_FAILURE);}// 2. 地址重用(避免 TIME_WAIT 导致 bind 失败)intopt=1;setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));// 3. 绑定地址server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=INADDR_ANY;// 监听所有网卡server_addr.sin_port=htons(PORT);if(bind(server_fd,(structsockaddr*)&server_addr,sizeof(server_addr))==-1){perror("bind failed");exit(EXIT_FAILURE);}// 4. 开始监听if(listen(server_fd,BACKLOG)==-1){perror("listen failed");exit(EXIT_FAILURE);}printf("Server listening on port %d...\n",PORT);while(1){// 5. 接受连接(阻塞式)client_fd=accept(server_fd,(structsockaddr*)&client_addr,&client_len);if(client_fd==-1){perror("accept failed");continue;}charclient_ip[INET_ADDRSTRLEN];inet_ntop(AF_INET,&client_addr.sin_addr,client_ip,INET_ADDRSTRLEN);printf("New connection from %s:%d\n",client_ip,ntohs(client_addr.sin_port));// 6. 读写数据ssize_tn=read(client_fd,buffer,BUF_SIZE-1);if(n>0){buffer[n]='\0';printf("Received: %s\n",buffer);// 回显write(client_fd,"Server received: ",17);write(client_fd,buffer,n);}// 7. 关闭客户端连接close(client_fd);}close(server_fd);return0;}

4. TCP 客户端完整示例

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#defineSERVER_IP"127.0.0.1"#definePORT8888#defineBUF_SIZE1024intmain(){intsock;structsockaddr_inserv_addr;charbuffer[BUF_SIZE];// 1. 创建 socketsock=socket(AF_INET,SOCK_STREAM,0);if(sock==-1){perror("socket failed");exit(EXIT_FAILURE);}// 2. 设置服务器地址serv_addr.sin_family=AF_INET;serv_addr.sin_port=htons(PORT);if(inet_pton(AF_INET,SERVER_IP,&serv_addr.sin_addr)<=0){perror("Invalid address");exit(EXIT_FAILURE);}// 3. 连接服务器if(connect(sock,(structsockaddr*)&serv_addr,sizeof(serv_addr))==-1){perror("connect failed");exit(EXIT_FAILURE);}printf("Connected to server %s:%d\n",SERVER_IP,PORT);// 4. 发送数据constchar*message="Hello from client!";send(sock,message,strlen(message),0);// 5. 接收响应ssize_tn=read(sock,buffer,BUF_SIZE-1);if(n>0){buffer[n]='\0';printf("Server reply: %s\n",buffer);}close(sock);return0;}

5.常见 Socket 编程模型对比(选择题/面试常考)

模型并发能力代码复杂度资源占用适用场景备注
多进程(fork)连接数少、每个连接处理时间长经典 Apache prefork 模式
多线程中高连接数中等pthread / C++ std::thread
IO 多路复用高并发、短连接select / poll / epoll(Linux 首选)
事件驱动极高高并发服务器libevent / libev / libuv / epoll
协程中~高极低高并发、业务逻辑复杂libco / boost.coroutine / C++20 coroutine

6. 学习进阶路线建议(Linux 网络编程)

阶段重点内容推荐练习
入门socket / bind / listen / accept / connect / read / write / close实现 echo 服务器/客户端
中级setsockopt / getsockopt / SO_REUSEADDR / SO_KEEPALIVE / TCP_NODELAY处理 TIME_WAIT、粘包、半包
进阶select / poll / epoll / epoll ET / LT 模式实现高并发 echo server
高级非阻塞 IO + 状态机 / Reactor / Proactor / 协程网络库实现简易 Redis 服务器 / Web 服务器
实战muduo / libevent / nginx / redis 网络模块阅读理解真实项目中的网络模型

7. 小结:一句话记住 Socket 编程本质

“Socket 编程 = 创建通信端点 + 绑定地址(服务器) + 建立连接 + 数据收发 + 关闭连接”

如果你现在想继续深入某个具体方向,可以直接告诉我:

随时说,我可以继续手把手带你写代码或深入讲解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 12:56:21

75 CyclicBarrier循环屏障

CyclicBarrier循环屏障 本文深入剖析CyclicBarrier循环屏障的核心原理与应用场景,详解await等待机制、reset重置操作、分阶段任务执行策略,对比CountDownLatch的区别,掌握多线程协同任务的最佳实践。 1 为什么需要CyclicBarrier? 实际业务场景 在企业级系统开发中,经常遇到需…

作者头像 李华
网站建设 2026/4/9 2:46:31

CANN shmem 共享内存通信模型的进程间同步机制

cann组织链接&#xff1a;https://atomgit.com/cann shmem仓库链接&#xff1a;https://atomgit.com/cann/shmem 前言 在多进程、多设备协同计算场景中&#xff0c;高效的进程间同步是确保数据一致性和执行正确性的关键。CANN&#xff08;Compute Architecture for Neural Net…

作者头像 李华
网站建设 2026/4/12 6:34:10

软著通:让软著申请变得简单到爆炸!

有没有遇到过这种情况&#xff1a;心血来潮做了个超炫酷的软件&#xff0c;结果却因为一堆软著材料而心情崩溃&#xff1f;“要写什么&#xff1f;要整理什么&#xff1f;这些东西哪来的排版和分页&#xff1f;”—你不是一个人&#xff0c;很多开发者都在为这事儿抓狂。软著通…

作者头像 李华
网站建设 2026/4/14 0:18:03

【YOLOv8多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CGSAFusion跨模态门控注意力融合模块,通过自注意力机制 和 门控融合提升多模态信息融合,助力红外与可见光检测高效涨点

一、本文介绍 🔥本文给大家介绍使用 CGSA(Cross-Domain Gated Self-Attention)跨模态门控注意力融合模块 改进 YOLOv8 多模态目标检测 模型,可以通过自注意力机制和门控融合动态增强可见光与红外图像之间的特征交互,显著提升小目标检测能力。CGSA 通过频域信息和时域差异…

作者头像 李华
网站建设 2026/4/14 19:26:40

蜜雪冰城 小程序 sign 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分python代码url "/api/v2/sho…

作者头像 李华
网站建设 2026/4/3 20:12:28

例说FPGA:可直接用于工程项目的第一手经验【3.7】

18.4 软件程序解析 1.main.c源文件软件程序解析 main.c的函数列表如表18-2所示。 表18-2 main.c文件的函数列表 2.int main(void)函数 主函数上电后稍作延时,主要是确保ADV7513芯片进入工作状态,接着给连接逻辑端hdmi_mode信号的PIO赋值,设置HDMI驱动的分辨率。代码中已经…

作者头像 李华