$kernelink route --hydrate --safe

页面加载 /
跳到正文
19.md
workspace / posts
~/posts/19.md 阅读中

嵌入式Linux Socket网络编程实战:TCP服务器客户端示例

TECH DIARY

嵌入式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)

参数说明
domainAF_INET(IPv4,最常用)/ AF_INET6 / AF_UNIX
typeSOCK_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 · 技术日记

comments.cmd 可写入
guest@kernelink:~/posts/19$ comment --compose
identity.env 访客信息
插入 访客会话 Text + UBB · UTF-8 · LF 0 字符