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

socket通信中的accept函数

int connfd = ::accept(m_sockfd, (struct sockaddr*)&addr, &addr_len);

你已经意识到这里有的是传入参数,有的是传出参数,说明你在认真理解系统调用的行为 —— 这是系统编程非常重要的能力。


✅ 先回顾一下 accept() 的函数原型:

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

✅ 参数逐个讲清楚:

参数名类型方向说明
sockfdint输入参数监听 socket 的文件描述符,即 m_sockfd,必须已 listen()
addrstruct sockaddr*输出参数用于返回客户端的地址信息(写入数据)
addrlensocklen_t*输入/输出参数初始传入 addr 的大小,返回时被修改为实际使用的大小

✅ 一句话总结每个参数作用

m_sockfd(传入参数)

  • 这是你前面用 socket() + bind() + listen() 得到的监听 socket。

  • 告诉操作系统:“我现在要从这个 socket 上接收一个连接请求”。


(struct sockaddr*)&addr(传出参数)

  • 这是输出用的结构体,系统会在连接建立后,把客户端的 IP/端口信息写入到 addr 里。

  • 所以你需要提前定义这个变量(如 sockaddr_in addr;),传指针进去。


&addr_len(传入 + 传出)

  • 你一开始要告诉操作系统:“这个地址结构的大小是多大”(通常是 sizeof(addr))。

  • 系统会在调用结束时修改它的值为实际写入的字节数(即客户端地址信息长度)。

  • 这是典型的 C 接口“in/out”双向参数。


✅ 图示理解参数传递方向:

调用前:m_sockfd → 已监听的 socketaddr     → 空结构体,等着系统写入客户端地址addrlen  → sizeof(addr)调用后(成功):connfd   → 新的连接 socketaddr     → 填好了客户端 IP/端口addrlen  → 系统写回实际地址长度

✅ 常见错误提醒:

  1. ❌ 没有给 addr_len 设置初值:

    socklen_t addr_len;
    accept(sockfd, (sockaddr*)&addr, &addr_len); // ❌ 未初始化,可能失败
    
  2. ✅ 正确做法是:

    socklen_t addr_len = sizeof(addr);
    

✅ 补充:返回值 connfd

  • 它是新的 socket fd,专门用于与当前这个客户端通信

  • m_sockfd 不同(后者还在继续监听新的连接)


✅ 总结重点:

参数输入 / 输出作用
m_sockfd输入哪个监听 socket 来 accept
addr输出客户端地址将被写到这里
addr_len输入 + 输出告诉系统结构体多大、系统写入实际使用大小

http://www.xdnf.cn/news/6656.html

相关文章:

  • 【vue】封装接口,全局字典,表格表头及使用
  • 子查询对多层join优化记录
  • 汉诺塔超算堆栈结构编码和流程详细设计(附源代码)
  • 什么是有向图 无向图 求图的邻接矩阵 软考
  • 搭建游戏云服务器的配置要求包括哪些条件?
  • S32DS使用JLINK编译调试问题点记录
  • Nginx常用命令
  • 在24GB显存大小的GPU上运行27GB的Pytorch模型
  • 基于 Java Socket 的多线程网络聊天程序
  • 依赖倒转原则:Java 架构设计的核心准则
  • 【数据机构】2. 线性表之“链表”
  • 如何使用 Solana Yellowstone gRPC 重新连接和重放插槽
  • Leetcode76覆盖最小子串
  • 软件架构风格系列(4):事件驱动架构
  • 【八股战神篇】Java高频基础面试题
  • C++ 中,using namespace std
  • 一款利用ADB (安卓调试桥)来控制手机的玩机工具
  • Java基础(反射)
  • MySQL——3、数据类型
  • AI:初识NLP
  • Java基础学习
  • NAR项目文章 | 真菌染色质重塑因子通过调控tRNA转录来调节蛋白翻译
  • 《Cryptical Path》开发诀窍:像玩游戏一样开发一款类Rogue游戏
  • shiro 反序列化攻防
  • 【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
  • AI数字人+展厅,定义未来展示空间的新模式
  • 如何选择PCB快速打样生产厂家?
  • UWB定位方案在水力发电站人员安全的应用推荐
  • C语言实现简单的—栈
  • 【漫话机器学习系列】261.工具变量(Instrumental Variables)