手写 TCP 客户端:Connect 连接与 inet_pton 实战详解
一、 客户端与服务器的异同
编写客户端代码时,最大的区别在于初始化阶段:
- 不需要
bind(通常):客户端不需要固定的端口号,操作系统会在调用connect时自动分配一个临时的可用端口。 - 不需要
listen/accept:客户端是主动发起方,不是被动等待方。 - 核心动作:
socket->connect->send/recv。
二、 关键函数解析
1. inet_pton:IP地址转换的新标准
在配置服务器地址时,我们人类习惯看"192.168.1.100"这种点分十进制字符串,但网络协议栈只认32位的大端整数。
inet_pton(Presentation to Network) 是inet_addr的现代替代品,支持 IPv4 和 IPv6。
// 原型intinet_pton(intaf,constchar*src,void*dst);// 用法示例structsockaddr_inaddr;// 将字符串 "192.168.1.5" 转换为网络字节序整数,存入 addr.sin_addrinet_pton(AF_INET,"192.168.1.5",&addr.sin_addr.s_addr);2. Connect:发起三次握手
// 原型intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);- addr: 这里的地址结构体必须填写服务器的 IP 和端口(切记不能写
INADDR_ANY,那是服务器用的)。 - 返回值: 成功返回 0,失败返回 -1(如服务器没开、网络不通)。
三、 代码实战:心跳客户端
下面的代码实现了一个“话痨”客户端:每隔 1 秒向服务器发送一条带计数的消息,并等待服务器的回复。
1. 完整代码 (tcp_client.c)
#include<stdio.h>#include<stdlib.h>#include<unistd.h><