各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb
Socket 编程客户端篇:Connect 隐式绑定与数据发送实战
如果说服务器是“坐地经营”的店家(被动等待),那么客户端就是“上门拜访”的顾客(主动发起)。在 Socket 编程中,客户端的开发流程相对简洁,但其中隐藏的隐式绑定和内核写缓冲区机制却是面试和实战中的高频考点。
一、 发起连接:Connect 函数
connect是客户端最标志性的函数。它的调用标志着 TCP 三次握手的开始。
1. 函数原型
intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);- sockfd:客户端自己创建的套接字文件描述符。
- addr:注意!这里填入的是服务器的 IP 和端口信息(你要去连谁)。
- addrlen:地址结构体的内存大小。
2. 核心机制:隐式绑定 (Implicit Binding)
你可能会发现,客户端代码中很少见到bind函数。
- 问题:客户端不需要端口吗?
- 答案:需要,但不需要你自己指定。
- 原理:当你调用
connect时,如果该套接字没有绑定端口,Linux 内核会自动从临时端口范围(Ephemeral Ports)中分配一个未被占用的端口(例如 54321)分配给它。这就是隐式绑定。
3. 返回值与错误
- 0:握手成功,连接建立。
- -1:失败。
- ECONNREFUSED:最常见的错误,表示目标 IP 的目标端口上没有程序在监听(服务器没开,或者被防火墙拦截)。
二、 发送数据:Write vs Send
连接建立后,就可以像操作普通文件一样向套接字写入数据了。
1. 双生子:Write 与 Send
// 通用文件IOssize_twrite(intfd,constvoid*buf,size_tlen);// Socket专用ssize_tsend(intfd,constvoid*buf,size_tlen,intflags);- 区别:
send多了一个flags参数。 - 联系:当
send的