网络编程套接字(三)

      最后更新:2022-05-13 11:44:18 手机定位技术交流文章

      文章目录

      • TCP 初创者英语翻译服务器
        • 简单回顾
        • 修改处理器方法
        • 代码测试
      • 地址转换函数
        • IP IP 传输字符串 IP IP 整数 IP
        • 整数 IP 变成字符串 IP
        • 关于int_entoa 的函数
      • 绑定失败问题
      • TCP协议通讯流程
        • 通讯流程总览
        • 三次握手的过程
        • 数据传输的过程
        • 四次挥手的过程
      • TCP和UDP对比

      TCP 初创者英语翻译服务器

      简单回顾

      在上一篇博客 (二) 网络方案拟订集集 这是一个直截了当的 TCP 服务器 。初步成绩是TCP服务器的单执行流。代码测试显示,单个执行流 TCP 服务器无法同时为众多客户服务。这导致TCP服务器的多实施流。

      当多执行 TCP 服务器流实现时,它表明可以实现多少进程和线索。为了进一步改善多线 TCP 服务器,最后,线索库与TCP服务器连接。现在是访问TCP服务器众多客户的时候。他们由数名行政主管服务。因此,这些客户可以同时利用服务器的服务。

      当时我们说过,如果您希望位于此位置的 TCP 服务器承担额外任务,只是修改必要的处理功能。TCP服务器与线索库的最终实现匹配我们只是想在任务类别中 更新"处理者"的方法下面我们以实现TCP 初创者英语翻译服务器为例,让我们测试我们的 TCP 服务器是否仍能在更新后定期向客户提供英文翻译服务。

      修改处理器方法

      TCP服务器的英文译文是,根据客户的英文词,确定中文的意思,然后作为答复数据送交客户。

      我们以围捕的方式对待工作当线索库的线索从任务队列中获取工作时,将要求它使用 " 运行 " 方法处理这项任务。事实上,您在“运行方法”中称“手动方法”为“手动方法”, 以模仿函数的方式称其为“运行方法”。因此,我们需要做的就是修改 处理器类。(),我们不修改 任何其他通信代码。

      英文笔译员必须根据英文词来决定其普通话的意思。因此,我们必须绘制地图。英文术语用作地图的密钥 。它被中文用作与钥匙相对应的数值。在 C++STL 软件包中,可以直接使用未订购的地图容器。

      说明一下:

      • 此地图的定义是明确的, 因为这只是测试已更改的服务器能否为客户提供英文翻译服务。()重载函数当中。
      • 此函数启动此映射的操作 。它涉及在文字和中文含义之间建立绘图联系。为测试目的,代码中只界定了三套绘图关系。此外,初始地图操作应重建初始功能 。相反,每次客户要求提供英文译文时,都必须重新建立制图协会。
      • 如果你打算自己写英文译本该地图应定为静态地图。这是确保只有一张全球地图的唯一方法。服务器激活后, 此地图可以初始化 。中文与英文的相互参照可编为一份文件。您可以在服务器启动后装入它 。创建匹配的映射连接 。我们只是在这里试验,我不认为我做过很多设计工作
      • 当服务器向客户端提供英文翻译服务时,当地图上没有对键对对能够对键的关键值进行对接时,服务器将直接对用户向客户端提供的数据作出反应。

      代码测试

      TCP服务器现在可以向客户提供英文翻译服务,如果地图上有客户的一句话,服务器将以普通话对客户作出反应,否则它将以原始密封形式对客户作出反应。 答案P服务器现在可以向客户提供英文翻译服务。 如果地图上有客户的一句话,服务器将以普通话对客户作出反应,否则它将以原始密封形式对客户作出反应。
      在这里插入图片描述
      请记住,这只是为了通知你。通过修改这里的“处理器”方法,我们可能会改变服务器处理工作的逻辑。如果您想帮助提升 目前的英语翻译服务器,我们可以上网搜索牛津词典找文件kv 使用文字翻译和中文绘图。当服务器启动时, 您可以装入文件 。要构建匹配的映射连接,大约在这段时间左右,英文翻译服务器的网络版本已经完成。

      地址转换函数

      IP IP 传输字符串 IP IP 整数 IP

      函数 interet_tenta

      函数 interet_tenta的函数原型如下:

      参数说明:

      • cp: 要转换的 IP 字符串 。
      • 输入: 转换后, 整数 IP, 即输出类型参数 。

      返回值说明:

      • 如果转换成功,则返回非零值;否则,返回零值。

      函数 iet_Addr

      函数 iet_Addr的函数原型如下:

      参数说明:

      • cp: 要转换的 IP 字符串 。

      返回值说明:

      • 如果给定地址有效, 它返回转换整数 IP; 否则, 它返回 。INADDR_NONE(通常为-1)。

      函数 iet_ pton

      函数 iet_ pton的函数原型如下:

      参数说明:

      • af:协议家族。
      • rc: 要转换的 IP 字符串 。
      • dst: 转换后为整数 IP, 即输出型参数 。

      返回值说明:

      • 如果转换成功, 它返回 1 。
      • 如果输入的 IP 字符串无效, 它返回 0 。
      • 如果输入的协议家庭 af 无效,返回到 1 并设置错误到EAFNOSUPPORT

      整数 IP 变成字符串 IP

      函数 interet_tenta

      函数 interet_tenta的函数原型如下:

      参数说明:

      • 输入: 要翻译的整数 IP 地址 。

      返回值说明:

      • 转换后的字符串 IP 已返回 。

      函数 iet_ntop

      函数 iet_ntop的函数原型如下:

      参数说明:

      • af:协议家族。
      • src: 要翻译的整数 IP 地址 。
      • dst: IP 是一个转换成输出类型参数的字符串。
      • 大小:指定 dst 中可用字节的数量 。

      返回值说明:

      • 如果转换成功, 它返回非空引用 dst; 否则, 它返回 NULL 。

      说明一下

      • 由于它们足够简单,我们最常用的两个转换函数是 iint_addr 和 int_tenta。这两个函数的参数是要转换的字符串 IP 或整数 IP,而这两个函数的返回值是匹配的整数 IP 和字符串 IP 。
      • 其中inet_pton和函数 iet_ntop不仅可以转换IPv4的in_addr我还可以转换 IPv6 地址 。in6_addr因此,两个职能中的等同参数类型是:void*
      • 除了为满足具体的印刷情况而开发外,这些转换功能还用于数据分析,例如网络安全。

      关于int_entoa 的函数

      函数 interet_tenta可以将四字节的整数IP转换成字符串IP,此已变换的字符串 IP 保存在一个静态存储空间中, 此方法返回 。打电话者没有必要实际释放。但如果我们多次调用函数 interet_tenta,数据涵盖范围问题出现在现阶段。

      例如,下列代码连续调用了两次函数 interet_tenta。
      在这里插入图片描述
      由于函数 interet_tenta内部只在静态存储区申请了一块区域,因此函数 interet_tenta第二次转换的结果就会覆盖第一次转换的结果。
      在这里插入图片描述
      因此,如果需要多次调用函数 interet_tenta,那么就要及时保存inet_ntoa的转换结果。

      并发场景下的函数 interet_tenta

      函数 interet_tenta内部只在静态存储区申请了一块区域,为了保存已变换的字符串 IP,在互联网设置中,这被称为一个关键领域。允许通过不同途径同时进入关键地点将不可避免地造成异常。并且在APUE中,还明确指出,Mint_intoa不是线性安全功能。

      下面我们在多线程场景下对函数 interet_tenta进行测试:

      但是实际在centos7上测试时,在多线程场景下调用函数 interet_tenta并没有出现问题,可能是该函数内部的实现加了互斥锁,这就跟接口本身的设计也是有关系的。
      在这里插入图片描述
      鉴于此,在多线程环境下更加推荐使用函数 iet_ntop进行转换,因为该函数是由调用者自己提供缓冲区保存转换结果的,可以规避线程安全的问题。

      绑定失败问题

      资源未释放干净

      我们首先测试网络代码,先将服务绑到8081端口,然后运行客户端,并允许它连接到当前服务器。
      在这里插入图片描述
      如果服务在客户连接存在时被直接关闭,如果服务要能够再次约束8081港,服务就可能失败。
      在这里插入图片描述双方在TCP通信中改变状态的一个特征是没有约束力。目前无法解释。组织者将讨论TCP协议的具体细节。这里想说明的就是,领带可能断了无法约束是因为资源在服务结束时没有释放出来。

      端口号与另一个软件相关联。

      此外,未能具有约束力可能是由于目前的港口号已经与其他程序相连,例如,一项申请以前可能已经捆绑了8081号港口,而另一项试图捆绑8081号港口并失败。
      在这里插入图片描述
      这将表明,港口号只能通过程序与这一规则挂钩,保证港口号与服务之间的测绘工作本身是不同的。

      无法绑定的端口号

      端口号是使用我们创建的服务器代码约束的 。避免绑定的端口号小于 1024 。平均云服务器只能连接到 1024 个端口 。由于已决定1024以下港口将由其他更成熟的服务部门使用,如果我们把港口号定在1024以下那么会绑定失败。
      在这里插入图片描述
      因此,我们一般只能约束1024个港口及其上行港口号、8 00个更佳港口号及其在线港口号。

      说明一下:

      • 即使当我们在云服务器上写入代码时,代码并不在疑问中,但可以想象到您的云服务器没有打开的端口。此时,如果您想要测试网络代码,您必须在云服务器上打开安全组。

      TCP协议通讯流程

      通讯流程总览

      以下是以TCP为基础的客户/服务器方案的一般流动情况:
      在这里插入图片描述
      我们现在将结合TCP协议的通信进程,以及连接的形成与取消和各种网络界面之间的对应关系,审视三节握手和四节波。

      三次握手的过程

      在这里插入图片描述

      初始化服务器

      当服务器完成脚手架建筑、装订和监听等基本步骤时,它可以援引接受功能来阻止客户的请求。

      服务器初始化:

      • 通过调用套接字创建文件描述 。
      • 将当前文档配置与 IP/PORT 捆绑起来的调用; 如果该端口已被其他程序使用, 约束将失败 。
      • 呼叫收听以表示当前文档描述是作为服务器文件描述准备的,用于接受以下内容。
      • 接受该呼叫并阻断它直到客户端连接 。

      建立连接

      客户端完成设置后, 客户端会在适当的时候通过连接功能向服务器发送连接请求, 但是当连接完成时客户端会以某种方式三次摇动服务器, 因此连接真正启动握手三次 。

      建立连接的过程:

      • 通过调用套接字创建文件描述 。
      • 要开始服务器的连接请求, 请使用连接 。
      • 连接将传输 SYN, 等待服务器响应( 第一次) 。
      • 服务器在收到客户端的 SYN 后,用SYN-ACK 段落回复,表示“同意建立连接”(第二段)。
      • 客户获得 SYN-ACK, 断开连接, 并回复 ACK 段落( 3) 。

      这种连接方法被称为三种握手方式。

      应当指出,连接并非立即产生,由于TCP是传输层协议的一部分,两个操作系统将在连接建立时主动进行三次单独的协商,然后才能有效地建立连接。

      数据传输的过程

      在这里插入图片描述

      数据交互

      一旦建立和接受链接,客户和服务器在现阶段将能够与数据进行通信。需要注意的是,连接创建和连接到用户层是两个不同的进程。接受功能不参与三握手过程。因为三次握手 本身就是最底层的TCP的任务接受只需要达到与用户层连接的底部。如果最低水平没有很好地连接,接受功能然后停止连接,直到建立良好的连接。

      双方数据交换的真相是 他们使用阅读和写作。写作是其中之一, 他在写数据。数据在读取时会读取。写作工作涉及将用户数据复制到操作系统。以及何时和多少份以前数据的副本送交,以及多少份副本送交。TCP负责。Forread的作用是从内部向用户读取数据。

      数据传输的过程“:

      • 在建立连接时,TCP协议提供全时双重工作通信服务,这意味着通信双方可以同时撰写同一连接的数据,同时,有关的想法是半双重工作,同一连接只能由一方同时形成。
      • 当服务器从接受返回时, 它会调用读取; 读取套接字类似于读取管道, 如果数据不来, 它会拖着等待 。
      • 在此点, 客户端呼叫写作向服务器提出请求, 服务器在收到请求后从读起返回, 客户端呼叫读块以等待服务器的回复 。
      • 服务器的电话写回将处理结果反馈给客户端,并读取块以等待下一个请求。
      • 客户在拿到后,从阅读中返回并提交下一份请求书,允许继续这一进程。

      四次挥手的过程

      在这里插入图片描述

      端口连接

      双方对话结束后, 连接必须用四个波程序中断, 当客户拨打关闭连接时, 服务器最终关闭了匹配连接 。 有一次, 关闭两次, 而一对近距离波四次 。

      断开连接的过程:

      • 如果客户没有进一步的请求,该呼叫将终止连接,客户首次将FIN部分发送到服务器。
      • 服务器用ACK对 FIN 的回复, 而读取返回 0 (秒) 。
      • 在阅读返回后,服务器知道客户端已关闭连接, 并会叫近距离关闭连接, 到那个时候服务器将发送一个 FIN (第三次) 给客户端 。
      • 客户得到了FIN 并发送了第四 ACK服务器。

      这种分离程序经常被称为四波波。

      密切注意通信进程与套接字API之间的关系。

      当理解套接字 API时, 要记住应用和 TCP 协议是如何互动的:

      • 当应用程序援引套接字功能,例如使用连接传输 SYN 段时, TCP 协议层会采取什么步骤?
      • 该方案理解到,TCP协议层的地位已经改变,例如,从阻塞套接字功能返回,表示TCP协议收到具体段落,如读回0,收到FIN部分。

      为什么要断开连接?

      连接的主要目的是确保通信双方有独家连接,这样我们就可以增加许多传输计划,以确保数据传输的可靠性,然而,如果当事人之间的通信能够完成,该系统的资源就会越来越少。

      因为服务器会被连接炸弹袭击这些连接必须由该系统管理。管理关系时,我们必须"安排好"因此,一旦建立了联系,连接的相关数据结构将在服务完成时保留。它将构建这些关系的数据结构。在现阶段,操作系统的连接管理成为链表的增删。

      如果连接在建立后仍然开放,因此,操作系统必须维持适当的数据结构。维持这个数据结构 花费时间和空间双方通信完成后,应切断联系。为了防止浪费系统资源,这就是TCP比UDP更复杂的原因之一。因为TCP需要连接管理

      TCP和UDP对比

      • 可靠和不可靠的传输
      • 没有连接连接对连接
      • 数据报告对字节流

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/24691.html

          热门文章

          文章分类