**
Linux TCP网络编程核心API学习笔记
**
一、UDP包头与UDP特性
UDP头部一共8字节,分为4个字段:
- 源端口
- 目的端口
- 用户数据包长度
- 检查和
头部之后紧跟应用层数据。
UDP特点:
- 实现机制简单
- 资源开销小
- 无连接、不安全、不可靠,不保证数据送达。
二、TCP通信原理
TCP是面向连接的可靠传输协议,通信之前必须完成三次握手建立连接:
- 主动发起方发送
SYN请求连接; - 被动连接方回复
SYN+ACK,确认收到请求同时同步; - 发起方回复
ACK,连接正式建立。
连接建立完成后,才可以收发业务数据。
三、TCP核心套接字API
1. socket
c
int tcpsocket = socket(AF_INET, SOCK_STREAM, 0);
AF_INET:IPv4协议;SOCK_STREAM:代表TCP流式套接字。
返回套接字文件描述符,失败返回‑1。
2. connect(客户端使用:发起连接)
c
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能 :向服务端发送连接请求
参数:
sockfd:socket返回套接字fdaddr:目标服务端地址结构体addrlen:地址结构体大小
返回:成功返回0;失败返回‑1。
3. send(发送数据)
c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能 :向已经连接好的套接字发送数据
参数:
sockfd:通信文件描述符buf:待发送数据缓冲区首地址len:要发送的数据字节长度flags:标志位,填0即可
返回:成功返回实际发送字节数;失败返回‑1。
4. recv(接收数据)
c
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能 :从套接字读取对端发来的数据
参数:
sockfd:通信文件描述符buf:接收数据缓冲区len:最多接收的字节数flags:一般填0
返回:-
0:实际收到字节数量;
0:对方关闭连接;-1:出错。
⚠注意:recv不会自动补字符串结束符
\0,打印字符串需要手动添加buf[nret] = '\0'。
5. listen(服务端:开启监听)
c
int listen(int sockfd, int backlog);
功能 :将socket设置为监听状态,等待客户端连接
参数:
sockfd:socket创建的套接字fdbacklog:未处理连接队列最大数目
返回:成功返回0,失败返回‑1。
6. accept(服务端:取出连接)
c
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能 :从监听队列取出一条已经完成三次握手的客户端连接。
参数:
sockfd:listen之后的监听套接字addr:输出参数,存放客户端地址信息addrlen:传入地址缓冲区大小,调用结束返回真实地址长度
返回值:
成功返回全新通信文件描述符confd,后续收发数据使用这个fd;失败返回‑1。
重点区分:
sockfd:监听套接字,只负责接新客户端,不能收发业务数据;- accept返回的confd:真正用来send/recv和客户端通信。

四、简单总结
- UDP无连接,头部8字节,开销小,传输不可靠;
- TCP需要三次握手建立连接,可靠传输;
- 客户端流程:
socket→connect→send/recv; - 服务端流程:
socket→ bind →listen→accept→send/recv; recv返回0代表对方断开,是网络编程重要判断条件。