嵌入式Linux Socket网络编程实战
2026年7月28日 · TCP服务器客户端C语言示例 · IT中华技术日记
IT中华 本文整理嵌入式 Linux 下 Socket 网络编程核心知识:Socket 本质、核心 API 详解、IP 地址格式转换,附 TCP 服务器与客户端的完整 C 语言实战代码。
Socket 本质
Socket 是 Linux 下的进程间通信机制(socket IPC),采用客户端-服务器模式。其本质是应用层与 TCP/IP 协议通信的中间软件抽象层,属于门面模式——隐藏复杂协议,开发者无需深入理解 TCP/UDP 细节即可编程。BSD Socket 标准跨平台性强,可在 Linux、LwIP、Windows、RT-Thread 移植。
核心 API 详解
socket() —— 创建套接字
int socket(int domain, int type, int protocol)
| 参数 | 说明 |
|---|---|
| domain | AF_INET(IPv4,最常用)/ AF_INET6 / AF_UNIX |
| type | SOCK_STREAM(TCP)/ SOCK_DGRAM(UDP)/ SOCK_RAW |
| protocol | 通常设 0,表示默认协议 |
bind() —— 绑定地址
服务器必须调用,将 IP + 端口与套接字绑定。关键宏:
htons()/htonl():主机字节序 → 网络字节序(大端)INADDR_ANY:绑定所有本地网卡,嵌入式 DHCP 场景更灵活
listen() / accept() / connect()
- listen():仅服务器,进入监听状态,backlog 为等待队列上限
- accept():仅服务器,返回与客户端连接的新套接字
- connect():客户端,触发 TCP 三次握手
数据收发
read()/recv() 读取,write()/send() 发送。recv/send 带 flags 参数控制行为(MSG_DONTWAIT、MSG_OOB 等)。
IP 地址格式转换
// 点分十进制 → 二进制 inet_pton(AF_INET, "192.168.1.222", &addr); // 二进制 → 点分十进制 char buf[20]; inet_ntop(AF_INET, &addr, buf, sizeof(buf));
推荐使用 inet_pton/inet_ntop,同时支持 IPv4 和 IPv6。
TCP 服务器标准流程
socket() → bind() → listen() → accept() → recv/send → close() // 服务器示例核心 int sockfd = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8888); bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); listen(sockfd, 50); connfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen); // 通信循环 recv/send ... close(sockfd);
客户端流程
socket() → connect() → send循环 → close() // 客户端示例核心 int sockfd = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_port = htons(8888); inet_pton(AF_INET, "192.168.1.150", &server_addr.sin_addr); connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 循环 fgets → send ... close(sockfd);
编译与测试
arm-linux-gnueabihf-gcc -o server socket_server.c # 开发板 gcc -o client socket_client.c # PC端 # 开发板运行 ./server,PC运行 ./client # 客户端输入字符串,服务器端打印;输入 exit 双方断开
IT中华 小结:Socket 编程核心是"服务器 bind+listen+accept、客户端 connect"的 C/S 模式。字节序转换和 INADDR_ANY 是嵌入式场景下最容易踩的坑,务必理解网络字节序(大端)规范。
关于IT中华
IT中华(www.itzh.vip)持续关注嵌入式 Linux 与网络编程。本文转载改写自博客园 Javenwww 的技术文章。关注IT中华,获取更多底层开发笔记。
IT中华 · www.itzh.vip · 技术日记