【Linux网络编程】TCP套接字核心函数详解|三次握手|send/recv/listen/accept接口梳理

**

Linux TCP网络编程核心API学习笔记

**


一、UDP包头与UDP特性

UDP头部一共8字节,分为4个字段:

  1. 源端口
  2. 目的端口
  3. 用户数据包长度
  4. 检查和
    头部之后紧跟应用层数据。

UDP特点:

  • 实现机制简单
  • 资源开销小
  • 无连接、不安全、不可靠,不保证数据送达。

二、TCP通信原理

TCP是面向连接的可靠传输协议,通信之前必须完成三次握手建立连接:

  1. 主动发起方发送 SYN 请求连接;
  2. 被动连接方回复 SYN+ACK,确认收到请求同时同步;
  3. 发起方回复 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返回套接字fd
  • addr:目标服务端地址结构体
  • 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创建的套接字fd
  • backlog:未处理连接队列最大数目
    返回:成功返回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和客户端通信。

四、简单总结

  1. UDP无连接,头部8字节,开销小,传输不可靠;
  2. TCP需要三次握手建立连接,可靠传输;
  3. 客户端流程:socketconnectsend/recv
  4. 服务端流程:socket → bind → listenacceptsend/recv
  5. recv返回0代表对方断开,是网络编程重要判断条件。
相关推荐
我爱cope15 分钟前
【计算机网络 | 网络层12:SDN:控制平面与数据平面分离意味着什么?】
网络·学习·计算机网络·平面
阿崽meitoufa17 分钟前
Prompt Engineering for Agent:让 Agent 稳定运行的提示词写法
网络·人工智能·microsoft
筝筝ba21 分钟前
extended/factory_reset.robot
linux·运维·服务器·网络·网络协议·p2p
网安小学生(兼顾数据库版)22 分钟前
CRA漏洞通报义务倒计时:9.11生效要求深度解读
网络·安全·web安全
wangduqiang74724 分钟前
如何借助AI申请专利不依靠代理机构
linux
优化Henry26 分钟前
5G网络切片之S-NSSAIlist相关参数解析
运维·服务器·网络·笔记·学习·信息与通信
子有内涵32 分钟前
【Linux】C++ 实现可扩展 TCP 服务器|回响、字典、远程命令
linux·运维·服务器
新兴AI民工37 分钟前
# 【Linux内核三十六】进程管理模块:CFS负载均衡(一):sched_domain与sched_group层级构建
linux·运维·负载均衡
pride.li42 分钟前
WSL教程-WSL安装与配置Ubuntu
linux