0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析C++基础语法梳理之网络编程中Socket

C语言编程学习基地 来源:C语言编程学习基地 作者: C语言编程 2021-10-26 10:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Socket

Linux Socket 编程(不限 Linux)

a9b4f35c-357e-11ec-82a8-dac502259ad0.jpg

Socket 中的 read()、write() 函数

ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);

read()

read 函数是负责从 fd 中读取内容。

当读成功时,read 返回实际所读的字节数。

如果返回的值是 0 表示已经读到文件的结束了,小于 0 表示出现了错误。

如果错误为 EINTR 说明读是由中断引起的;如果是 ECONNREST 表示网络连接出了问题。

write()

write 函数将 buf 中的 nbytes 字节内容写入文件描述符 fd。

成功时返回写的字节数。失败时返回 -1,并设置 errno 变量。

在网络程序中,当我们向套接字文件描述符写时有俩种可能。

(1)write 的返回值大于 0,表示写了部分或者是全部的数据。

(2)返回的值小于 0,此时出现了错误。

如果错误为 EINTR 表示在写的时候出现了中断错误;如果为 EPIPE 表示网络连接出现了问题(对方已经关闭了连接)。

Socket 中 TCP 的三次握手建立连接

我们知道 TCP 建立连接要进行 “三次握手”,即交换三个分组。大致流程如下:

客户端向服务器发送一个 SYN J

服务器向客户端响应一个 SYN K,并对 SYN J 进行确认 ACK J+1

客户端再想服务器发一个确认 ACK K+1

只有就完了三次握手,但是这个三次握手发生在 Socket 的那几个函数中呢?请看下图:

a9c8e056-357e-11ec-82a8-dac502259ad0.png

从图中可以看出:

(1)当客户端调用 connect 时,触发了连接请求,向服务器发送了 SYN J 包,这时 connect 进入阻塞状态;

(2)服务器监听到连接请求,即收到 SYN J 包,调用 accept 函数接收请求向客户端发送 SYN K ,ACK J+1,这时 accept 进入阻塞状态;

(3)客户端收到服务器的 SYN K ,ACK J+1 之后,这时 connect 返回,并对 SYN K 进行确认;

(4)服务器收到 ACK K+1 时,accept 返回,至此三次握手完毕,连接建立。

Socket 中 TCP 的四次握手释放连接

上面介绍了 socket 中 TCP 的三次握手建立过程,及其涉及的 socket 函数。现在我们介绍 socket 中的四次握手释放连接的过程,请看下图:

a9da6f92-357e-11ec-82a8-dac502259ad0.png

图示过程如下:

某个应用进程首先调用 close 主动关闭连接,这时 TCP 发送一个 FIN M;

另一端接收到 FIN M 之后,执行被动关闭,对这个 FIN 进行确认。它的接收也作为文件结束符传递给应用进程,因为 FIN 的接收意味着应用进程在相应的连接上再也接收不到额外数据;

一段时间之后,接收到文件结束符的应用进程调用 close 关闭它的 socket。这导致它的 TCP 也发送一个 FIN N;

接收到这个 FIN 的源发送端 TCP 对它进行确认。

这样每个方向上都有一个 FIN 和 ACK。

————

今天的分享就到这里了,大家要好好学C++哟~

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7349

    浏览量

    95053
  • Socket
    +关注

    关注

    1

    文章

    214

    浏览量

    37037
  • 编程
    +关注

    关注

    90

    文章

    3724

    浏览量

    97458
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1434

    浏览量

    83782
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67867
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用VectorCAST/C++的AI辅助测试功能

    从2026版本开始,VectorCAST/C++推出首批AI辅助测试功能,旨在帮助开发团队解决单元测试过程的两个核心难点:
    的头像 发表于 04-27 14:37 269次阅读

    Libevent C++高并发网络编程 | 完结

     在2026年的技术版图中,尽管高级语言和AI辅助编程已经接管了大部分业务逻辑的构建,但在高并发、低延迟的核心网络基础设施领域,C++与Libevent的结合依然稳如磐石。它们构成了数字世界
    的头像 发表于 04-20 15:50 515次阅读

    C++与lua联合编程

    手工业”。然而,这两种内存管理机制截然不同的语言,如何在一个进程内进行高效的数据交换,一直是企业级开发的痛点。(看讠果aixuetang。xyz) 从经济学的视角来审视,夏曹俊老师《C++ 脚本编程
    发表于 04-19 16:27

    轻松掌握——LuatOS socket基础知识和应用开发

    LuatOS环境创建客户端与服务器、发送与接收数据等关键技能,为后续复杂应用打下坚实基础。 一、主要内容 LuatOS socket是LuatOS开发中最常用到的网络应用之一; LuatOS
    的头像 发表于 01-28 20:07 394次阅读
    轻松掌握——LuatOS  <b class='flag-5'>socket</b>基础知识和应用开发

    keil实现cc++混合编程

    起因项目中使用到一个开源的模拟IIC的库,封装的比较好,但是是使用c++写的。于是将其移植到自己的项目中,主要有以下三步操作: 在工程选项 C/C++中去掉勾选
    发表于 01-26 08:58

    汽车网络安全开发语言选型指南:C/C++/Rust/Java等主流语言对比+Perforce QAC/Klocwork工具支持

    汽车网络安全如何选编程语言?CC++、Rust、Java……谁更适合AUTOSAR、ISO/SAE 21434?一文了解8种主流语言的优劣与适用场景,以及Perforce QAC/K
    的头像 发表于 12-26 11:13 670次阅读
    汽车<b class='flag-5'>网络</b>安全开发语言选型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流语言对比+Perforce QAC/Klocwork工具支持

    C语言与C++的区别及联系

    C语言和C++到底是什么关系? 首先C++C语言本来就是两种不同的编程语言,但C++确实是对
    发表于 12-24 07:23

    CC++之间的联系

    1、语法兼容性: C++完全兼容C语言的语法,这意味着任何有效的C语言程序都可以直接在C++
    发表于 12-11 06:51

    C语言和C++之间的区别是什么

    C++的标准库那样集成度高和功能齐全。 6、编译器与语言特性: C++编译器通常比C语言编译器更加复杂,因为它需要处理更多的语言特性,比如模板元编程、命名空间、引用等。
    发表于 12-11 06:23

    socket是什么

    Socket(套接字)是计算机网络的一个概念,它指示了一个可以进行网络通信的软件端点。通过使用Socket,计算机程序可以通过
    发表于 12-03 08:27

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等
    发表于 12-02 07:12

    强实时运动控制内核MotionRT750(六):us级高速交互C++,为智能装备提速

    Windows下运动控制实时内核MotionRT750的高速交互C++
    的头像 发表于 09-04 14:50 944次阅读
    强实时运动控制内核MotionRT750(六):us级高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,为智能装备提速

    技能+1!如何在树莓派上使用C++控制GPIO?

    和PiGPIO等库,C++可用于编程控制树莓派的GPIO引脚。它提供了更好的性能和控制能力,非常适合对速度和精度要求较高的硬件项目。在树莓派社区,关于“Python
    的头像 发表于 08-06 15:33 4517次阅读
    技能+1!如何在树莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++在物联网项目中同样广受欢迎且功能强大。那么,在树莓派项目中选择哪种语言更合适呢?Python因其简洁性、丰富的库和资源而被
    的头像 发表于 07-24 15:32 1129次阅读
    <b class='flag-5'>C++</b> 与 Python:树莓派上哪种语言更优?

    请问在k230的Socket、MQTT等常用网络编程应用如何实现图像传输呢?

    Socket、MQTT,或者网络通信应用如何实现图像传输呢? 能给几个提示或者参考例程吗。谢谢 micropython 请参考如下例子 https
    发表于 06-17 06:29