当前位置: 首页 > news >正文

三次握手内部实现原理

socket()创建一个新的套接字

int socket(int domain, int type, int protocol);

参数:

domain:地址族,如 AF_INET(IPv4),AF_INET6(IPv6)

type:套接字类型,如 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)

protocol:协议类型,通常为 0(默认协议)

返回值:成功返回套接字描述符,失败返回 -1

Linux操作系统流行一句话,“一切皆文件”,这里的文件不是说文件系统,磁盘里的某个文件,而是struct flie

也就是说,socket也其实也是一个struct file,将socket的所有底层都抽象为一个socket

bind()就是将套接字绑定到一个本地地址(IP+端口)

具体操作也就是将IP和端口号赋值到socket对象的成员里面去

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:

sockfd:套接字描述符

addr:指向 struct sockaddr 类型的指针,包含要绑定的地址信息

addrlen:地址长度,通常为 sizeof(struct sockaddr_in)

返回值:成功返回 0,失败返回 -1

listen()将套接字设置为被动监听模式,准备接受连接请求

int listen(int sockfd, int backlog);

参数:

sockfd:套接字描述符

backlog:等待连接队列的最大长度

返回值:成功返回 0,失败返回 -1

Listen()函数的最主要作用就是:初始化半连接队列(哈希表) + 全连接队列(链表)

半连接队列的作用就是,区分来客户端的请求是第一次握手还是第三次握手

全连接队列的作用是,让accept()函数从其中取走已完成连接的socket

accept()接受一个来自客户端的连接请求

底层就是去全连接队列里取socket

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:

sockfd:监听套接字描述符

addr:指向 struct sockaddr 类型的指针,接收客户端的地址信息

addrlen:地址长度指针,接收客户端地址长度

返回值:成功返回新的套接字描述符,失败返回 -1

connect()主动发起与服务器的连接

底层就是去,动态选择一个本地可用端口,作为发起连接的源端口

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:

sockfd:套接字描述符

addr:指向 struct sockaddr 类型的指针,包含服务器的地址信息

addrlen:地址长度,通常为 sizeof(struct sockaddr_in)

返回值:成功返回 0,失败返回 -1

http://www.lryc.cn/news/545633.html

相关文章:

  • ES from size聚合查询10000聚合查询,是每个分片先聚合,再统计。还是所有节点查询1万条后,再聚合
  • JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码
  • Redis详解(实战 + 面试)
  • 宝塔webhooks与码云实现自动部署
  • 什么是Agentic AI?(Doubao-1.5-pro-32k 大模型开启联网回答)
  • LSTM预测模型复现笔记和问题记录
  • 开篇词 | Go 项目开发极速入门课介绍
  • 《论软件测试中缺陷管理及其应用》审题技巧 - 系统架构设计师
  • 虚拟机快照与linux的目录结构
  • FPGA时许约束与分析 1
  • 【STM32F103ZET6——库函数】6.PWM
  • 基于SpringBoot + Vue的商城购物系统实战
  • Perl 调用 DeepSeek API 脚本
  • 2025国家护网HVV高频面试题总结来了01(题目+回答)
  • 【前端基础】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)
  • 【前端场景题】如何应对页面请求接口的大规模并发问题
  • Sublime Text4安装、汉化
  • Python PDF文件拆分-详解
  • MacDroid for Mac v2.3 安卓手机文件传输助手 支持M、Intel芯片 4.7K
  • 人大金仓国产数据库与PostgreSQL
  • 阿里云 Qwen2.5-Max:超大规模 MoE 模型架构和性能评估
  • C++ 标准库容器的常用成员函数
  • MySQL双主搭建-5.7.35
  • Uniapp开发微信小程序插件的一些心得
  • Vscode通过Roo Cline接入Deepseek
  • 不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比
  • 如何有效判断与排查Java GC问题
  • 【笔记】用大预言模型构建专家系统
  • Android SystemUI深度定制实战:下拉状态栏集成响铃功能开关全解析
  • 【Python】基础语法三