一、网络编程先理解什么
Linux 网络编程的核心是 socket。socket 是应用程序访问网络的接口,HTTP、WebSocket、RPC 等上层协议最终都建立在 socket 之上。
入门需要先理解:
- IP:主机地址。
- 端口:进程提供服务的入口。
- TCP:可靠字节流。
- UDP:无连接数据报。
- 服务端:监听端口,等待连接。
- 客户端:主动连接服务端。
二、TCP 服务端流程
一个最小 TCP 服务端通常包含:
1 | socket -> bind -> listen -> accept -> read/write -> close |
含义:
socket:创建套接字。bind:绑定 IP 和端口。listen:开始监听。accept:接受客户端连接。read/write:收发数据。close:关闭连接。
三、最小 TCP Echo Server
1 |
|
编译:
1 | gcc tcp_echo_server.c -o tcp_echo_server -Wall -Wextra -g |
运行:
1 | ./tcp_echo_server |
另开终端测试:
1 | nc 127.0.0.1 8080 |
输入内容后回车,服务端会原样返回。
四、查看端口
查看监听端口:
1 | ss -lntp |
只看 8080:
1 | ss -lntp | grep 8080 |
如果启动时报错:
1 | bind: Address already in use |
说明端口已经被占用。
五、TCP 客户端流程
客户端通常是:
1 | socket -> connect -> write/read -> close |
示例:
1 |
|
六、阻塞和并发
上面的服务端一次只处理一个连接。真实服务通常需要并发。
常见方式:
- 多进程:每个连接 fork 一个子进程。
- 多线程:每个连接创建一个线程。
- IO 多路复用:
select、poll、epoll。 - 事件库:libevent、libuv、asio。
入门阶段建议先写阻塞版本,理解流程后再学习 epoll。
七、常用排错工具
测试 HTTP:
1 | curl -v http://127.0.0.1:8080 |
测试 TCP:
1 | nc 127.0.0.1 8080 |
查看端口:
1 | ss -lntp |
查看进程打开的 socket:
1 | lsof -p <pid> |
抓包:
1 | sudo tcpdump -i any port 8080 |
看系统调用:
1 | strace -e trace=network ./tcp_echo_server |
八、常见问题
8.1 Connection refused
客户端连接被拒绝,通常是服务端没启动,或者端口不对。
检查:
1 | ss -lntp | grep 8080 |
8.2 Address already in use
端口被占用。
检查:
1 | ss -lntp | grep 8080 |
8.3 只能本机访问
如果服务端绑定的是 127.0.0.1,外部机器无法访问。需要绑定 0.0.0.0 或指定网卡 IP。
8.4 防火墙阻断
服务启动了,但外部访问失败,可能是防火墙或云安全组限制。
九、继续学习
建议路线:
- 写 TCP echo server。
- 写 TCP echo client。
- 支持多客户端。
- 理解粘包和协议边界。
- 写简单 HTTP server。
- 学习 non-blocking socket。
- 学习 epoll。
- 阅读成熟网络库。
网络编程不是只会调用 socket API,更重要的是理解连接生命周期、错误处理和线上排错。
- 本文链接: https://blog.hansong.icu/2026/06/21/Linux_Dev_Network_Programming/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。