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

【socket编程中的常规操作,阻塞/非阻塞模式的差别】

我们来详细讲解一下 Socket 编程的常规操作以及阻塞与非阻塞模式的核心差别。这对于理解网络编程至关重要。


第一部分:Socket 编程的常规操作

Socket 编程就像是两部电话之间的通信过程。下面我们以最常见的 ​​TCP 协议​​为例,讲解其常规操作步骤。

服务端 (Server) - “接电话的人”

服务端的流程可以概括为:​​创建 -> 绑定 -> 监听 -> 接受 -> 通信 -> 关闭​​。

  1. ​创建 Socket (socket)​

    • 使用 socket()系统调用创建一个通信端点(Socket)。这相当于买一部电话机。

    • 需要指定地址族(如 AF_INET用于 IPv4)、套接字类型(如 SOCK_STREAM用于 TCP)和协议。

    • int server_socket = socket(AF_INET, SOCK_STREAM, 0);

  2. ​绑定地址 (bind)​

    • 使用 bind()将 Socket 与一个本地 IP 地址和端口号绑定。这相当于给电话机申请一个电话号码。

    • 服务端必须这么做,以便客户端能够找到它。

    • bind(server_socket, (struct sockaddr*) &server_addr, sizeof(server_addr));

  3. ​监听连接 (listen)​

    • 使用 listen()告诉操作系统,这个 Socket 愿意接受传入的连接请求,并设置连接请求队列的最大长度。这相当于把电话机的铃声打开,并准备好接听。

    • listen(server_socket, 5); // 队列长度为5

  4. ​接受连接 (accept)​

    • 使用 accept()​阻塞​​地等待客户端的连接请求。当有客户端连接时,它返回一个​​新的 Socket​​ 用于与这个特定的客户端通信。

    • 这相当于拿起响铃的电话听筒。原来的 Socket 仍然用于继续监听新的连接。

    • int client_socket = accept(server_socket, (struct sockaddr*) &client_addr, &client_addr_len);

  5. ​数据交换 (read/write 或 recv/send)​

    • 使用 read()recv()从客户端 Socket 接收数据。

    • 使用 write()send()向客户端 Socket 发送数据。

    • 这相当于在电话中和对方交谈。

  6. ​关闭连接 (close)​

    • 通信完毕后,使用 close()关闭 Socket,释放资源。这相当于挂断电话。

    • close(client_socket);关闭与客户端的连接。

    • close(server_socket);关闭监听套接字(通常服务端不会关闭这个)。

客户端 (Client) - “打电话的人”

客户端的流程更简单:​​创建 -> 连接 -> 通信 -> 关闭​​。

  1. ​创建 Socket (socket)​

    • 和服务端一样,先“买一部电话机”。

    • int client_socket = socket(AF_INET, SOCK_STREAM, 0);

  2. ​建立连接 (connect)​

    • 使用 connect()向服务端的地址(IP 和端口)发起连接请求。这相当于拨打对方的电话号码。

    • connect(client_socket, (struct sockaddr*) &server_addr, sizeof(server_addr));

  3. ​数据交换 (read/write)​

    • 连接建立后,就可以像服务端一样使用 read()和 write()进行通信了。

  4. ​关闭连接 (close)​

    • 通信完毕,关闭 Socket。

    • close(client_socket);


http://www.dtcms.com/a/434397.html

相关文章:

  • 5G NR PDCCH DCI
  • 网站建设海淀区360浏览器打开是2345网址导航
  • 《代码随想录》二叉树专题算法笔记
  • CSS3 用户界面
  • 虚幻引擎UE5专用服务器游戏开发-32 使用Gameplay Tags阻止连招触发
  • 鼠标垫东莞网站建设网站建设公司的公司
  • SOAR技术与高效网络安全运营
  • Node.js 本地服务部署、常驻及调用完整笔记
  • Java 工具类 Hutool、Guava 与 Apache Commons 的区别
  • 怎么创建网站挣钱济南产品网站建设外包
  • BEV query 式图片点云视觉特征融合
  • 操作系统应用开发(十二)RustDesk 用户服务器搭建——东方仙盟筑基期
  • 将若依(RuoYi)项目创建为私有Gitee仓库的完整步骤
  • 网站上的百度地图标注咋样做app开发制作专业吗
  • TCP 协议核心面试题 (附答案详解)
  • Spring Security 实战:彻底解决 CORS 跨域凭据问题与 WebSocket 连接失败
  • Tabby下载安装与连接服务器
  • Apache Beam入门教程:统一批流处理模型
  • 计算机毕业设计 基于Hadoop的信贷风险评估的数据可视化分析与预测系统 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【QT常用技术讲解】QTablewidget单元格存储隐藏的数据
  • K8s学习笔记(九) job与cronjob
  • MATLAB线性代数函数完全指南
  • 关于单片机外设存储芯片的应用笔记(IIC驱动)
  • 梅州网站建设南宁网站 制作
  • 2015 年真题配套词汇单词笔记(考研真相)
  • 中国建设银行舟山分行网站网站构建的过程
  • python如何通过链接下载保存视频
  • K-Lite Mega/FULL Codec Pack(视频解码器)
  • SpringBoot+Vue医院预约挂号系统 附带详细运行指导视频
  • 85-dify案例分享-不用等 OpenAI 邀请,Dify+Sora2工作流实测:写实动漫视频随手做,插件+教程全送