精华内容
下载资源
问答
  • 以太网服务器和客户端
    千次阅读
    2018-03-07 17:23:43

    问题描述:redis客户端连接redis服务器之后,发现客户端和服务其显示的端口号不同。

    如图:


    服务器日志:Accepted 127.0.0.1:62149    显示客户端的信息

    客户端日志:redis 127.0.0.1:6379   显示服务器的信息

    解释:

    服务端和客户端处于同一台主机,所以IP是相同的,不同的Port是用来区分主机上不同的应用程序。

    IP确定哪一台主机

    Port确定主机上的哪一个应用程序

    更多相关内容
  • 服务器和客户端有什么区别呢?根据用途,服务器可以分为很多种类,其硬件操作系统与客户端是有所不同的。但是,网络相关的部分, 如网卡、协议栈、Socket 库等功能和客户端却并无二致。无论硬件 OS 如何变化,...

    客户端与服务器的区别

       
          服务器和客户端有什么区别呢 根据用途 服务器可以分为很多种类, 其硬件和操作系统与客户端是有所不同的 但是 网络相关的部分 , 如网卡、 协议栈 Socket 库等功能和客户端却并无二致 无论硬件和 OS 如何变化, TCP IP 的功能都是一样的 或者说这些功能规格都是统一的 。 不过, 它们的功能相同 不代表用法也相同 在连接过程中 客户端发起连接操作, 而服务器则是等待连接操作 因此在 Socket 库的用法上还是有一些区别的, 即应用程序调用的 Socket 库的程序组件不同 。此外, 服务器的程序可以同时和多台客户端计算机进行通信 这也是一点区别。 因此 服务器程序和客户端程序在结构上是不同的
     
     

    服务器的结构

     
         服务器需要同时和多个客户端通信 但一个程序来处理多个客户端的 请求是很难的 因为服务器必须把握每一个客户端的操作状态 。因此一般的做法是, 每有一个客户端连接进来,就启动一个新的服务器程序,确保服务器程序和客户端是一对一的状态 。 具体来说, 服务器程序的结构如图 所示
     
         首先 我们将程序分成两个模块, 等待连接模块 a )) 负责与客户端通信的模块 图( b ))
     
    1)创建等待连接模块
     
    当服务器程序启动并读取配置文件完成初始化操作后 就会运行等待连接模块( a )。 这个模块会创建套接字 然后进入等待连接的暂停状态。
     
    2)等待连接模块运行并接受连接
     
    接下来 当客户端连发起连接时 这个模块会恢复运行并接受连接 , 然后启动客户端通信模块( b ), 并移交完成连接的套接字 接下来 客户端通信模块( b 就会使用已连接的套接字与客户端进行通信。
     
    3)通信结束后
     
    通信结束后 每次有新的客户端发起连接 都会启动一个新的客户端通信模块 b ),因此( b 与客户端是一对一的关系
     
     
          这样, b 在工作时就不必考虑其他客户端的连接情况, 只要关心自己对应的客户端就可以了 通过这样的方式, 可以降低程序编写的难度 服务器操作系统具有多任务 多线程 功能, 可以同时运行多个程序 服务器程序的设计正是利用了这一功能 。 当然, 种方法在每次客户端发起连接时都需要启动新的程序,这个过程比较耗时,响应时间也会相应增加 因此 还有一种方法是事先启动几个客户端通信模块,当客户端发起连接时,从空闲的模块中挑选一个出来将套接字移交给它来处理。这个模块就退出了。
     

     
     

    服务器端的套接字与端口号

     
           刚才我们介绍了服务器程序的大体结构 但如果不深入挖掘调用Socket 库的具体过程 我们还是无法理解服务器是如何使用套接字来完成通信的。 因此 下面就来看一看服务器程序是如何调用 Socket 库的
     
     
    通过数据收发来区分
     
            首先, 我们来看看客户端与服务器的区别 从数据收发的角度来看, 区分 客户端 服务器 这两个固定的角色似乎不是一个好办法。 现在大多数应用都是由客户端去访问服务器 但其实应用的形态不止这一种。 为了能够支持各种形态的应用,最好是在数据收发层面不需要区分客户端和服务器,而是能够以左右对称的方式自由发送数据。 TCP 也正是在这样的背景下设计出来的。不过, 这其中还是存在一个无法做到左右对称的部分,那就是连接操作 连接这个操作是在有一方等待连接的情况下 另一方才能发起连接,如果双方同时发起连接是不行的, 因为在对方没有等待连接的状态下 无法单方面进行连接。 因此,只有这个部分必须区分发起连接和等待连接这两个不同的角色 从数据收发的角度来看 这就是客户端与服务器的区别 也就是说,发起连接的一方是客户端,等待连接的一方是服务器。 这个区别体现在如何调用 Socket 库上 首先 客户端的数据收发需要经过下面 4 个阶段。
     
    客户端
     
    1 创建套接字 创建套接字阶段
    2 用管道连接服务器端的套接字 连接阶段
    3 收发数据 收发阶段
    4 断开管道并删除套接字 断开阶段
     
     
    服务器
     
    相对地 服务器是将阶段 2 改成了等待连接 具体如下
     
    1 创建套接字 创建套接字阶段
    2-1 将套接字设置为等待连接状态 等待连接阶段
    2-2 接受连接 接受连接阶段
    3 收发数据 收发阶段
    4 断开管道并删除套接字 断开阶段
     
         下面我们像前面介绍客户端时一样 用伪代码来表示这个过程 如图所示。
     
           首先, 协议栈调用 socket 创建套接字 1 )), 这一步和客户端是相同的 。接下来调用 bind 将端口号写入套接字中 2-1 ))。 在客户端发起连接的操作中, 需要指定服务器端的端口号 这个端口号也就是在这一步设置的。 具体的编号是根据服务器程序的种类 按照规则来确定的 ,例如Web 服务器使用 80 号端口。

     

     
           设置好端口号之后 协议栈会调用 listen 向套接字写入等待连接状态这一控制信息( 2-1 ))。 这样一来 套接字就会开始等待来自客户端 的连接网络包。然后, 协议栈会调用 accept 来接受连接 2-2 ))。 由于等待连接的模块在服务器程序启动时就已经在运行了, 所以在刚启动时 应该还没有客户端的连接包到达。 可是,包都没来就调用 accept 接受连接,可能大家会感到有点奇怪,不过没关系,因为如果包没有到达,就会转为等待包到达的状态,并在包到达的时候继续执行接受连接操作
     
          因此 在执行accept 的时候 一般来说服务器端都是处于等待包到达的状态 这时应用程序会暂停运行。 在这个状态下 一旦客户端的包到达 就会返回响应包并开始接受连接操作。 接下来 协议栈会给等待连接的套接字复制一个副本, 然后将连接对象等控制信息写入新的套接字中 刚才我们介绍了调用 accept 时的工作过程 到这里 我们就创建了一个新的套接字 , 并和客户端套接字连接在一起了。
     
       当 accept 结束之后 等待连接的过程也就结束了 这时等待连接模块会启动客户端通信模块, 然后将连接好的新套接字转交给客户端通信模块 , 由这个模块来负责执行与客户端之间的通信操作。 之后的数据收发操作和 刚才说的一样 与客户端的工作过程是相同的。

     

     
     
        其实在这一系列操作中, 还有一部分没有讲到 那就是在复制出一个新的套接字之后, 原来那个处于等待连接状态的套接字会怎么样呢
     
     
    等待连接的套接字仅作为生产新副本的模板:
     
         其实它还会以等待连接的状态继续存在 当再次调用 accept 客户端连接包到达时, 它又可以再次执行接受连接操作 接受新的连接之后 和刚才一样 协议栈会为这个等待连接的套接字复制一个新的副本,然后让客户端连接到这个新的副本套接字上。 像这样每次为新的连接创建新的套接字就是这一步操作的一个关键点。 如果不创建新副本 而是直接让客户端连接到等待连接的套接字上, 那么就没有套接字在等待连接了 这时如果有其他客户端发起连接就会遇到问题。 为了避免出现这样的情况 协议栈采用了这种创建套接字的新副本, 并让客户端连接到这个新副本上的方法
     
     
    新副本与模板套接字同端口号
     
          此外,创建新套接字时端口号也是一个关键点 端口号是用来识别套接字的, 因此我们以前说不同的套接字应该对应不同的端口号 但如果这样做, 这里就会出现问题 因为在接受连接的时候 新创建的套接字副本就必须和原来的等待连接的套接字具有不同的端口号才行。 这样一来 比如客户端本来想要连接 80 端口上的套接字 结果从另一个端口号返回了包, 这样一来客户端就无法判断这个包到底是要连接的那个对象返回的 , 还是其他程序返回的。 因此,新创建的套接字副本必须和原来的等待连接的套接字具有相同的端口号。 但是这样一来又会引发另一个问题。 端口号是用来识别套接字的 如果一个端口号对应多个套接字, 就无法通过端口号来定位到某一个套接字了。 当客户端的包到达时 如果协议栈只看 TCP 头部中的接收方端口号 ,是无法判断这个包到底应该交给哪个套接字的。 这个问题可以用下面的方法来解决 ,即要确定某个套接字时,不仅使用服务器端套接字对应的端口号,还同时使用客户端的端口号再加上 IP 地 址 总共使用下面 4 种信息来进行判断
     
     

     

          服务器上可能存在多个端口号相同的套接字,但客户端的套接字都是对应不同端口号的,因此我们可以通过客户端的端口号来确定服务器上的某个套接字 不过 使用不同端口号的规则仅限一台客户端的内部 当有多个客户端进行连接时, 它们之间的端口号是可以重复的 因此 我们还必须加上客户端的 IP 地址才能进行判断
     
     
    描述符和端口号的区别
     
          例如 IP 地址为 198.18.203.154的客户端的 1025 端口 就和 IP 地址为 198.18.142.86 的客户端的 1025 口对应不同的套接字 如果能够理解上面这些内容 ,那么关于套接字和端口号的知识就已经掌握得差不多了。说句题外话, 既然通过客户端 IP 地址 客户端端口号 服务器 IP 地址、 服务器端口号这 4 种信息可以确定某个套接字 那么要指代某个套接字时用这 4 种信息就好了 为什么还要使用描述符呢 这个问题很好 不过我们无法用上面 4 种信息来代替描述符 原因是 在套接字刚刚创建好 还没有建立连接的状态下,这 4 种信息是不全的。此外,为了指代一个套接字,使用一种信息(描述符)比使用 4 种信息要简单。 出于上面两个原因, 应用程序和协议栈之间是使用描述符来指代套接字的
     

     

     

     

    服务器的接收操作

         
    1)电信号转数字信号
        

          现在, 客户端发送的网络包已经到达了服务器。到达服务器的网络包其本质是电信号或者光信号,接收信号的过程和客户端是一样的。接收操作的第一步是网卡接收到信号,然后将其还原成数字信息 域网中传输的网络包信号是由 1 0 组成的数字信息与用来同步的时钟信号叠加而成的,因此只要从中分离出时钟信号然后根据时钟信号进行同步,就可以读取并还原出 1 0 的数字信息了。 信号的格式随传输速率的不同而不同,因此某些操作过程可能存在细微差异,例如 10BASE-T 的工作方式如图所示首先从报头部分提取出时钟信号),报头的信号是按一定频率变化的只要测定这个变化的频率就可以和时钟信号同步了。接下来按照相同的周期延长时钟信号图  ②),并在每个时钟周期位置检测信号的变化方向 )。图中用向上和向下的箭头表示变化方向,实际的信号则是正或负的电压这里需要检测电压是从正变为负,还是从负变为正这两种变化方向分别对应 0 1 (图 )。在图中向上的箭头为 1向下的箭头为 0实际上是从负到正变化为 1从正到负变化为 0这样信号就被还原成数字信息了

     

     

    2)FCS校验

          接下来需要根据包末尾的帧校验序列(FCS)来校验错误 即根据校验公式 计算刚刚接收到的数字信息 然后与包末尾的 FCS 值进行比较 。 FCS 值是在发送时根据转换成电信号之前的数字信息进行计算得到的 , 因此如果根据信号还原出的数字信息与发送前的信息一致, 则计算出的 FCS 也应该与包末尾的 FCS 一致 如果两者不一致 则可能是因为噪声等影响导致信号失真, 数据产生了错误 这时接收的包是无效的 因此需要丢弃
     
    3)检查MAC头部
     
         当 FCS 一致 即确认数据没有错误时 接下来需要检查 MAC 头部中的接收方 MAC 地址,看看这个包是不是发给自己的 以太网的基本工作方式是将数据广播到整个网络上, 只有指定的接收者才接收数据 因此网络中还有很多发给其他设备的数据在传输, 如果包的接收者不是自己 那么就需要丢弃这个包。
     
    4)中断:提醒CPU
     
        到这里, 接收信号并还原成数字信息的操作就完成了 还原后的数字信息被保存在网卡内部的缓冲区中。 上面这些操作都是由网卡的 MAC 来完成的。在这个过程中, 服务器的 CPU 并不是一直在监控网络包的到达 而是在执行其他的任务, 因此 CPU 并不知道此时网络包已经到达了 但接下来的接收操作需要 CPU 来参与 因此网卡需要通过中断将网络包到达的事件通知给 CPU 。接下来, CPU 就会暂停当前的工作 并切换到网卡的任务
     
    5)运行网卡驱动,确定协议类型
     
           然后 网卡驱动会开始运行, 从网卡缓冲区中将接收到的包读取出来 根据 MAC头部的以太类型字段判断协议的种类,并调用负责处理该协议的软件 这里, 以太类型的值应该是表示 IP 协议 因此会调用 TCP/IP 协议栈 并将包转交给它
     
    6)调用IP模块
     
        当网络包转交到协议栈时 IP 模块会首先开始工作 检查 IP 头部 IP模块首先会检查 IP 头部的格式是否符合规范,然后检查接收方 IP 地址, 看包是不是发给自己的 当服务器启用类似路由器的包转发功能时 对于 不是发给自己的包 会像路由器一样根据路由表对包进行转发 确认包是发给自己的之后,接下来需要检查包有没有被分片 检查 IP头部的内容就可以知道是否分片 如果是分片的包 则将包暂时存放在内存中, 等所有分片全部到达之后将分片组装起来还原成原始包 如果没有分片, 则直接保留接收时的样子 不需要进行重组 到这里 我们就完成了包的接收。 接下来需要检查 IP 头部的协议号字段,并将包转交给相应的模块 例如, 如果协议号为 06 十六进制 ), 则将包转交给 TCP 模块 如果是 11 十六进制), 则转交给 UDP 模块 这里我们假设这个包被交给 TCP 模块处理, 然后继续往下看。
     

     

    7)调用TCP模块:TCP处理连接包

          前面的步骤对于任何包都是一样的 但后面的 TCP 模块的操作则根据包的内容有所区别
       
          首先 我们来看一下发起连接的包是如何处理的 。 当 TCP 头部中的控制位 SYN 1 表示这是一个发起连接的包(图 )。 这时 TCP 模块会执行接受连接的操作 不过在此之前,需要先检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同且正在处于等待连接状态的套接字 如果指定端口号没有等待连接的套接字, 则向客户端返回错误通知的包 。如果存在等待连接的套接字, 则为这个套接字复制一个新的副本 将发送方 IP 地址 端口号 、序号初始值、窗口大小等必要的参数写入这个套接字中, 同时分配用于发送缓冲区和接收缓冲区的内存空间 然后生成代表接收确认的 ACK 用于从服务器向客户端发送数据的序号初始值 , 表示接收缓冲区剩余容量的窗口大小, 并用这些信息生成 TCP 头部,委托IP模块发送给客户端 。这个包到达客户端之后, 客户端会返回表示接收确认的 ACK 当这个 ACK 号返回服务器后 连接操作就完成了 。这时, 服务器端的程序应该进入调用 accept 的暂停状态 当将新套接字的描述符转交给服务器程序之后, 服务器程序就会恢复运行
     
    如果收到的是发起连接的包,则 TCP 模块会:
     
    (1) 确认 TCP 头部的控制位 SYN;
    (2) 检查接收方端口号;
    (3) 为相应的等待连 接套接字复制一个新的副本;
    (4) 记录发送方 IP 地址和端口号等信息。
     

     

    8)调用TCP模块:TCP处理数据包

          接下来我们来看看进入数据收发阶段之后 当数据包   到达时 TCP 模块是如何处理的(   )。
     
          首先, TCP 模块会检查收到的包对应哪一个套接字 在服务器端 可能有多个已连接的套接字对应同一个端口号, 因此仅根据接收方端口号无法找到特定的套接字。 这时我们需要根据 IP 头部中的发送方 IP 地址和接收方 IP 地址,以及 TCP 头部中的接收方端口号和发送方端口号共 4 种信息,找到上述 4 种信息全部匹配的套接字
     
          找到 4 种信息全部匹配的套接字之后 TCP 模块会对比该套接字中保存的数据收发状态和收到的包的 TCP 头部中的信息是否匹配 以确定数据收发操作是否正常。 具体来说,就是根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的 TCP 头部中的序号是否一致 如果两者一致 就说明包正常到达了服务器 没有丢失 这时 TCP模块会从包中提出数据, 并存放到接收缓冲区中 与上次收到的数据块连接起来。 这样一来 数据就被还原成分包之前的状态了 当收到的数据进入接收缓冲区后,TCP 模块就会生成确认应答的 TCP头部 并根据接收包的序号和数据长度计算出 ACK 号 然后委托 IP 模块
    发送给客户端 。 收到的数据块进入接收缓冲区, 意味着数据包接收的操作告一段落了
     
        接下来, 应用程序会调用 Socket 库的 read   来获取收到的数据 , 这时数据会被转交给应用程序。 果应用程序不来获取数据,则数据会被一直保存在缓冲区中 但一般来说 应用程序会在数据到达之前调用 read等待数据到达, 在这种情况下 TCP 模块在完成接收操作的同时 就会执行将数据转交给应用程序的操作。然后, 控制流程会转移到服务器程序 对收到的数据进行处理 也就是检查 HTTP 请求消息的内容 并根据请求的内容向浏览器返回相应的数据。

     

    收到数据包时,TCP 模块会:
     
    (1) 根据收到的包的发送方 IP 地址、发送方端口号、接收方 IP 地址、接收方端口号找到相对应的套接字;
    (2) 将数据块拼合起来并保存在接收缓冲区中;
    (3) 向客户端返回 ACK。
     
     
     
    9)调用TCP模块:断开连接操作
     
          当数据收发完成后 便开始执行断开操作 这个过程和客户端是一样的, 让我们简单复习一下 。在 TCP 协议的规则中 断开操作可以由客户端或服务器任何一方发起, 具体的顺序是由应用层协议决定的 Web 这一顺序随 HTTP 协议版本不同而不同, HTTP1.0 是服务器先发起断开操作 。这时, 服务器程序会调用 Socket 库的 close TCP 模块会生成一个控制位 FIN 1 TCP 头部 并委托 IP 模块发送给客户端 当客户端收到在返回 ACK 号之前,会先等待一段时间,看看能不能和后续的应答包合并。 这个包之后 会返回一个 ACK 接下来客户端调用 close 生成一个 FIN 1 TCP 头部发给服务器 服务器再返回 ACK 这时断开操作 就完成了 HTTP1.1 是客户端先发起断开操作 这种情况下只要将客 户端和服务器的操作颠倒一下就可以了 无论哪种情况,当断开操作完成后,套接字会在经过一段时间后被删除。
     
     
    展开全文
  • VC++平台上实现以太网通讯,包括VC_TCP_Server服务器端的实现VC_TCP_Client客户端的实现,可供学习设计参考。
  • 三菱IQ-R系列PLC与上位机或服务器或TCP助手进行Socket通信,PLC作为客户端的配置说明
  • modbus客户端服务器区别 内容精选换一换文件系统创建完成后,用户需在客户端挂载文件共享,在本地共享目录CSG的文件共享建立映射,通过操作本地的目录实现对CSG共享目录的操作,实现数据实时上云管理。本章节主要...

    modbus客户端服务器区别 内容精选

    换一换

    c8a5a5028d2cabfeeee0907ef5119e7e.png

    文件系统创建完成后,用户需在客户端挂载文件共享,在本地共享目录和CSG的文件共享建立映射,通过操作本地的目录实现对CSG共享目录的操作,实现数据实时上云管理。本章节主要介绍在Windows Server 2008客户端挂载NFS文件共享的操作指导。不同操作系统安装NFS客户端的命令不同,已明确服务器操作系统类型为Windows。已在CSG

    当出现以下问题时,可以参考本章节排查解决。可以直接访问后端业务,但是无法通过负载均衡访问后端业务。通过私网IP可以访问负载均衡,但是公网IP无法访问负载均衡。后端服务器健康检查异常。客户端通过负载均衡访问服务器示意图如图1。公网客户端的流量经过EIP传送到负载均衡器;私网客户端的流量直接通过私网IP传送到负载均衡器。负载均衡器根据监听器配

    modbus客户端服务器区别 相关内容

    一般的HTTPS业务场景只对服务器做认证,因此只需要配置服务器的证书即可。某些关键业务(如银行支付),需要对通信双方的身份都要做认证,即双向认证,以确保业务的安全性。此时,除了配置服务器的证书之外,还需要配置客户端的证书,以实现通信双方的双向认证功能。本章节以自签名证书为例,介绍如何配置HTTPS双向认证。但是自签名证书存在安全隐患,建议

    本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例。操作系统使用场景:弹性云服务器的操作系统以Linux为例,客户端本地使用的计算机系统以Windows为例。目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。该弹性云服务器必须处于目标实例所属安全组允许访问的范围内。如

    modbus客户端服务器区别 更多内容

    5a6f55482f6b3f19420161bd3dfbba6a.png

    GaussDB(DWS) 支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。为支持SSL连接方式,GaussDB(DWS) 已经从CA认证中心申请到正式的服务器、客户端的证书和密钥(假设服务器的私钥为server.key

    b5693ff7a1d6bd5360d83fe2bfafdfb3.png

    介绍使用同一VPC内弹性云服务器ECS上的C# Redis客户端连接Redis实例的方法。更多的客户端的使用方法请参考Redis客户端。已成功申请Redis实例,且状态为“运行中”。已创建弹性云服务器,创建弹性云服务器的方法,请参见《弹性云服务器用户指南》。如果弹性云服务器为Linux系统,该弹性云服务器必须已经安装gcc编译环境。具体步

    3534dd170a545b94273de228dc486b40.png

    如果客户端工具的运行环境为Linux环境,您需要准备一台和CloudTable集群在相同虚拟私有云的Linux弹性云服务器作为客户端主机。例如,使用以下客户端工具访问集群,建议使用Linux弹性云服务器:HBase shellGeoMesa命令行工具如果客户端工具的运行环境为Windows环境,您需要准备一台和CloudTable集群在相

    e08a3c1d383ce0289aa478984d9adca2.png

    1.HTTP协议HTTP是超文本传输协议,是一个基于请求与响应,无状态的应用层协议2.HTTPS协议HTTPS是超文本传输安全协议为什么HTTPS是安全的?加密是用什么实现的答:因为它在HTTP协议上建立了SSL加密层,对传输数据进行加密,HTTP先与SSL通信,SSL再与TCP通信。有了SSL就会

    来自:博客

    9bf196c9a2e0b7b0bc69748c838418a5.png

    本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例。操作系统使用场景:弹性云服务器的操作系统以Linux为例,客户端本地使用的计算机系统以Windows为例。目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。该弹性云服务器必须处于目标实例所属安全组允许访问的范围内。如

    ea3d514774dda107c847f333927c833f.png

    本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)副本集实例。操作系统使用场景:弹性云服务器的操作系统以Linux为例,客户端本地使用的计算机系统以Windows为例。目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。该弹性云服务器必须处于目标实例所属安全组允许访问的范围内。

    39119fac39059b64817699818002d26a.png

    华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。

    b80c406dd1bff1336ad2b20072f4b1ca.png

    本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)副本集实例。操作系统使用场景:弹性云服务器的操作系统以Linux为例,客户端本地使用的计算机系统以Windows为例。目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。该弹性云服务器必须处于目标实例所属安全组允许访问的范围内。

    f3b054c7f0f3a487e0ff47ff2b7b5851.png

    当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载,其他版本请参考以下主要步骤根据实际界面进行配置。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。裸金属服务器、容器(CCE&CCI)操作与云服务器一致。已完成

    5eb5094525ac38c82d2a8e7d84950748.png

    JAVA面试常考系列十

    题目一

    Servlet是什么?Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。一般情况下,Servlet主要用于处理或者存储由HTML

    来自:博客

    c2f51807c80a3c0a9fb1f931f2bad396.png

    帐户需要通过实名认证,否则无法创建缓存实例。用户默认可以创建的实例数和总内存有配额限制,不同的用户在不同的区域配额可能不同,具体配额请以控制台查询为准。配额的相关信息,请参考如何查看和修改我的配额。如果需要申请扩大配额,请提交工单申请。公有云采用虚拟私有云(VPC)管理各服务的网络安全。对于Redis和Memcached缓存实例,客户端需

    展开全文
  • 可以模拟主站从站,规约包括101,cdt,104,modbus,103,以太网103
  • Socket tool发送Fins/TCP命令 实验设备:CJ2M-CPU33(PLC) 实验目的:发送Fins/TCP命令读写CJ2M-CPU33的数据
  • libev:一个功能齐全的高性能(请参阅基准)事件循环,在libevent之后进行松散建模,但没有限制错误。 它用于GNU虚拟专用以太网,rxvt-unicode,audited,Deliantra MORPG服务器和客户端以及许多其他程序中
  • 用C#窗体界面程序实现客户端和服务器的通讯,用到套接字socket。
  • 文章目录TCPUDPTCP的三次握手四次分手TCPUDP的区别关于Socket(套接字)Qt TCP服务器的设计与实现使用Qt的 帮助TCP服务器和客户端 区别UI界面设计代码设计与实现ui的槽验证TCP服务器设计Qt TCP客户端的设计与...


    这篇文章主要从实战的角度出发,对于设计的实现进行一个详细的说明,tcp和udp的原理就简单的描述,网络上也有大量的详细说明。

    TCP和UDP

    TCP的三次握手和四次分手

    我们知道TCP建立连接需要经过三次握手,而断开连接需要经过四次分手,那三次握手和四次分手分别做了什么和如何进行的。
    在这里插入图片描述
    第一次握手: 建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

    第二次握手: 服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

    第三次握手: 客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

    完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。通信结束客户端和服务端就断开连接,需要经过四次分手确认。

    第一次分手: 主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

    第二次分手: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

    第三次分手: 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

    第四次分手: 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

    可以看到一次tcp请求的建立及关闭至少进行7次通信,这还不包过数据的通信,而UDP不需3次握手和4次分手。

    TCP和UDP的区别

    1. TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

    2. 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

    关于Socket(套接字)

    现在我们了解到TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口。这就是Socket。
    在这里插入图片描述

    现在我们知道,Socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。

    不同语言都有对应的建立Socket服务端和客户端的库

    Qt TCP服务器的设计与实现

    使用Qt的 帮助

    对于Qt,自带的 “帮助” 可谓是神器,这里讲首先介绍如何通过帮助开启一个不熟悉的设计
    在这里插入图片描述
    输入关键词tcp,可以看到有tcp seriver和tcp socket两个索引,对于tcp主要就是需要这两个部分的函数。

    在上图的红色圆圈中,可以得到两个重要的信息,一个是

    qmake:QT += network
    

    这个需要在工程的 .pro 文件中添加qmake,也就是如图所示的位置
    在这里插入图片描述

    帮助中显示还有一个重要的头文件需要添加,就是这个:

    Header:#include <QTcpServer> 
    

    在这里插入图片描述
    这样,最基本的工作算是完成了。后面用到帮助时候再去查找即可

    TCP服务器和客户端 区别

    tcp需要区分服务器和客户端,所以,首先来介绍一下区别
    在这里插入图片描述

    例如在使用 TCP 通讯建立连接时采用客户端服务器模式,这种模式又常 常被称为主从式架构,简称为 C/S 结构,属于一种网络通讯架构,将通讯的双 方以客户端(Client )与服务器 (Server) 的身份区分开来。使用 C/S 结构的通 信常见的还有 S7 通信, ISO-on-TCP 通信。

    服务器的特征:被动角色,等待来自客户端的连接请求,处理请求并回传结果。

    客户端的特征:主动角色,发送连接请求,等待服务器的响应。

    根据主从关系,还是比较容易区分服务器和客户端的区别,其实就是多了一个请求的功能。

    UI界面设计和原则

    在这里插入图片描述
    先来展示一下最终的效果图片,因为是TCP服务器的设计,所以只需要接受就可以,也就是只需要输入正确的端口号就可以接收数据。

    对于界面中的按钮和模块,在菜单中的位置如下
    在这里插入图片描述
    在这里插入图片描述
    需要注意的是下面几点

    1. 模块名字一定要重新自定义,并且名字要简单清晰明了
      在这里插入图片描述

    2. 接收窗口在设计上只需要显示接受数据就可以,不应该有输入的功能,所以要修改成只读
      在这里插入图片描述

    3. 有些文字框需要设置左对齐或者右对齐,保证美观
      在这里插入图片描述

    4. 布局,优先小布局,尽量的能行排列还有列排列的先进行排列,最后在整体布局

    5. 对于弹簧的使用
      在这里插入图片描述

    6. 整体窗口的大小设置,最大值和最小值设置相同,就可以固定大小了
      在这里插入图片描述

    代码设计与实现

    QT编写的TCP服务器

    ui的模块功能定义

    有了ui界面,就可以直接对界面进行槽函数的设计,需要的模块右键,转到槽
    在这里插入图片描述
    在这里插入图片描述
    然后就会跳转到我们的代码界面,也就是自动的生成了一个槽函数来供我们使用。
    在这里插入图片描述
    在头文件中,也可以看到生成的对应的函数声明
    在这里插入图片描述
    因为我们现在是对打开服务器这个按钮进行功能的设计,所以要实现的功能就是绑定端口号到socket,然后进行全局的监听。

    void Widget::on_openBt_clicked()
    {
        /*
         * QHostAddress::Any 监听来自所有人的连接
         * listen返回值是无符号类型,所以要对text进行转换
         * 监听所有的设备,读取端口号转化成符合规范的形式
         */
        tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());
    }
    

    在这里插入图片描述

    对于listen这个函数,端口号格式需要是quint16,可以通过鼠标的悬停获得这样的 信息。

    自定义信号槽实现newConnection()

    但是这样只是打开了设备的监听功能,需要通过自定义信号槽,来实现创建连接的功能,tcp是面向连接的服务,所以,要建立新连接才能进行正常的通信。

    首先是我们在开启了监听端口的服务后,监听到了是需要建立连接才能进行下一步的通信,所以,要创建连接,带着这个目的,来到tcpserver的帮助,可以看到有个SINGAL
    在这里插入图片描述

    点进去SIGNAL就可以看到有两个函数,newConnection显然就是我们需要建立新连接的函数,然后查看详情,证实了我们的猜测。
    在这里插入图片描述
    在这里插入图片描述
    所以可以设置我们的槽函数代码如下

     connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot()));
    

    nextPendingConnection()接受挂起的连接作为已连接的QTcpSocket

    建立的新连接之后,我们需要一个读取和显示的操作,所以建立连接之后,我们要再执行自定义函数newConnection_Slot()

    怎么写,还是先看qt的帮助文档

    Detailed Description
    The QTcpServer class provides a TCP-based server.
    This class makes it possible to accept incoming TCP connections. You can specify the port or have QTcpServer pick one automatically. You can listen on a specific address or on all the machine's addresses.
    Call listen() to have the server listen for incoming connections. The newConnection() signal is then emitted each time a client connects to the server.
    Call nextPendingConnection() to accept the pending connection as a connected QTcpSocket. The function returns a pointer to a QTcpSocket in QAbstractSocket::ConnectedState that you can use for communicating with the client.
    If an error occurs, serverError() returns the type of error, and errorString() can be called to get a human readable description of what happened.
    When listening for connections, the address and port on which the server is listening are available as serverAddress() and serverPort().
    Calling close() makes QTcpServer stop listening for incoming connections.
    Although QTcpServer is mostly designed for use with an event loop, it's possible to use it without one. In that case, you must use waitForNewConnection(), which blocks until either a connection is available or a timeout expires.
    See also QTcpSocket, Fortune Server Example, Threaded Fortune Server Example, Loopback Example, and Torrent Example.
    
    // Google翻译
    详细说明
    QTcpServer类提供了一个基于TCP的服务器。
    此类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个。您可以侦听特定地址或所有机器的地址。
    调用listen()以使服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。
    调用nextPendingConnection()以接受挂起的连接作为已连接的QTcpSocket。该函数返回指向QAbstractSocket :: ConnectedState中的QTcpSocket的指针,可用于与客户端进行通信。
    如果发生错误,则serverError()返回错误的类型,并且可以调用errorString()以获取对所发生情况的易于理解的描述。
    侦听连接时,服务器正在侦听的地址和端口可用作serverAddress()和serverPort()。
    调用close()使QTcpServer停止侦听传入的连接。
    尽管QTcpServer主要设计用于事件循环,但也可以不使用事件循环。在这种情况下,您必须使用waitForNewConnection(),该阻塞将一直阻塞直到可用连接或超时到期为止。
    另请参见QTcpSocket,Fortune Server示例,Threaded Fortune Server示例,Loopback示例和Torrent示例。
    

    所以这里我们需要nextPendingConnection()函数,以接受挂起的连接作为已连接的QTcpSocket。如果没有这一步,那么我们每次通信都要建立一次连接,这样显然是不符合设计。建立了稳定的连接后,就是来进行正常的读写的操作了。

        /* 获得已经连接的客户端的socket */
        tcpSocket = tcpServer->nextPendingConnection();
    
    

    readyRead_Slot()监听数据的读取

    牵扯到信号的读写,就像单片机的中断接收函数一样,我们要先检测到有数据进来,才能进行处理,所以,找到监听数据读取的函数,我们开始查看Tcpsever下的函数,有没有类似功能的,
    在这里插入图片描述
    一眼望去应该是没有的,所以要去找函数的父类,看看有没有读写相关的函数
    在这里插入图片描述
    很不幸,QObject里也没有read相关的函数,只能继续看QObject的父类
    在这里插入图片描述
    这里有一个父类,QIODevice,跟硬件驱动有关,打开看一下
    在这里插入图片描述

    我们在信号中可以找到我们需要的函数了

    在这里插入图片描述

    每当有新数据可用于从设备读取时,都会发出此信号。 仅当有新数据可用时(例如,当网络套接字上有新的网络数据有效负载时,或将新的数据块附加到设备上时),才会再次发出该数据。
    readyRead()不会递归地发出; 如果您重新进入事件循环或在连接到readyRead()信号的插槽内调用waitForReadyRead(),则不会重新发出该信号(尽管waitForReadyRead()可能仍返回true)。
    对于开发人员实现从QIODevice派生的类的开发人员,请注意:当新数据到达时,您应该始终发出readyRead()(不要仅因为缓冲区中仍有待读取的数据而发出它)。 在其他情况下不要发出readyRead()。
    

    函数的说明很清晰的告诉我们了这是个监听数据的函数,所以我们离成功很近了,检测到数据之后,自然就是保存下来然后进行显示或者其他的处理,所以自定义槽函数来进行数据的处理。

        /* 获得了socket之后就可以进行读写的操作 */
        connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
    

    处理接收到的数据

    自定义的槽函数readyRead_Slot()就是在监听到有数据进来之后,开始准备一个缓冲区,接收存储数据,然后进行处理,这里我就只进行了一个显示的处理。

    void Widget::readyRead_Slot()
    {
        QString buf;
        buf = tcpSocket->readAll();
        ui->recvEdit->appendPlainText(buf);         // ui界面的接收框显示
    }
    

    到这里,小总结一下

    打开网络监听->绑定端口号到socket->挂起连接->监听数据读取的信号->处理读取到的数据

    关闭 发送 清空 实现

    同理,然后就是关闭服务器和发送数据的函数了,但是这个比较简单,所以就不详细说明了
    在这里插入图片描述
    同样的,发送函数write,也需要注意发送数据的格式。
    在这里插入图片描述

    验证TCP服务器设计

    现在有了服务器,那么可以使用网络上下载的网络调试助手开启一个tcp客户端功能来验证了
    在这里插入图片描述
    这里的验证过程可以加深对于TCP服务器的理解,服务器本身具有IP和端口号,IP一般是固定的,这里的默认就是我电脑设备的IP(我电脑的IP地址是192.168.0.105,也就是服务器IP是192.168.0.105),所以不需要手动来输入.

    只需要自定义服务器自己的端口号就可以了。

    对于TCP的客户端通过我们已经有的网络调试助手,可以看到,需要输入指定服务器的IP和端口号,才能进行连接。

    Qt TCP客户端的设计与实现

    客户端的设计流程和服务端大致相同,唯一不同的因为是**“主动设备”**,所以相比于服务端,多了一个主动发出建立连接请求的功能,所以重点也是这个功能的设计。

    UI界面的设计

    因为多了选择连接的服务器地址和端口号的主动连接功能,所以在UI界面的设计上需要增加这部分的设计
    在这里插入图片描述

    代码设计与实现

    源码下载

    QT编写的TCP客户端上位机

    connectToHost()连接从机

    在帮助中可以看到这么一个函数,可以实现对于指定从机的连接
    在这里插入图片描述

    tcpSocket->connectToHost(ui->ipLineEdit->text(), ui->portLineEdit->text().toUInt());
    

    配置好要链接的从机ip和端口号了,也连接了,那么还需要一个检测到连接的过程,这样才能触发后面的操作,也就是又要开始设计自定义的槽函数了,在tcpsocket的父类QAbstractSocket中有这样一个函数。
    在这里插入图片描述

    connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));
    

    所以,检测到连接成功,那么就执行connected_Slot()函数,实现读写的功能,这里就和之前的服务器大同小异了。

    验证TCP客户端

    这时候可以用我们自己设计的服务器和客户端直接进行互相的验证了。
    在这里插入图片描述

    结尾

    TCP上位机的设计到这里算是告一段落,后面还有UDP的上位机设计,还有UDP上位机与板间通信的设计与调试,尽请期待。

    展开全文
  • 本文介绍网络编程的基础知识,使用 Visual Studio 2019 在 linux 本地搭建一个服务器,将客户端与本地服务器连接起来,通过客户端服务器发送信息,测试服务端能否收到信息。
  • 客户端服务器

    2019-03-01 23:24:20
    实现多地远程连接服务器。并可互发信息,通过内网穿透可以实现完全自由的通信连接。中文注释完整。VS2017平台下编译执行。以太网通信实现。
  • 我用qt做TCP通信,结果客户端和服务端连接不上 有没有人知道哪里出了问题。 好像是IP地址和端口不对,但是怎么改都没用
  • android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
  • 计算机网络基础知识简答

    千次阅读 2020-01-29 17:37:30
    HttpHttps的区别 对称加密与非对称加密 三次握手过程 四次挥手过程 为什么TCP链接需要三次握手,两次不可以么,为什么? TCP协议如何来保证传输的可靠性 DDos 攻击 Get与POST的区别?...TCP/IP协议栈OSI七层...
  • 网络与TCP/IP协议-总结

    千次阅读 2021-08-08 06:07:29
    200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到...
  • 有两个客户端和一个TDMA服务器。执行在服务器中,有两个服务器同时运行的实例,一个是广播服务器-通过以太网广播信标包,另一个是数据服务器-等待来自无线媒体的数据。 首先,广播服务器会定期(在100毫秒后)为...
  • ModbusTcp客户端工具

    2020-04-05 11:55:16
    程序使用了NModbus4框架实现基于以太网TCP/IP的Modbus协议,能读写线圈、读写保持寄存器、读离散输入量输入寄存器。
  • 非常适合应用在低速采集的领域,早期的MODBUS协议只支持串口,后来发展出基于以太网口的MODBUS-TCP协议,我最终要用QT实现的,就是一个MODBUS-TCP服务器,以及与之通讯的MODBUS-TCP客户端。协议相关资料请看 MODBUS-...
  • 一 理解 TCP UDP 根据数据传输方式的不同,基于网络传输协议的套接字一般分为TCP套接字UDP套接字。因为TCP是面向连接的,因此又称为基于流(stream)的套接字。 TCP(Transmission Control Protocol,传输...
  • 最大最小帧的大小是以太网规定的,对于过小的帧,在发送时要填充。  TPSR为发送起始寄存器,将StartPage写入TPSR寄存器,高字节写入TBCRH(TBCR1),低字节写入TBCRL(TBCR0)。当写发送命令时,RTL8019AS将从TPSR...
  • 汇川AM600_AM400 tcp 服务器 客户端自由协议DEMO程序 .
  • 介绍使用带有WebSocketsREST API的HTTP服务器通过以太网的串行端口。 NOTE: This is an early version of the script - not yet ready for production environment. Please be patient. 入门安装软件包: npm ...
  • 三菱plcsocket通讯例子,客户端和服务器的例子
  • 简单的tcp客户端服务器 我这样做是为了向自己介绍以太网上的TCP连接。 它内置了客户端和服务器
  • 西门子CPU之间的以太网通讯,可以做服务器,也可以客户端方式。
  • 以太网调试助手软件工具,支持TCP协议UDP协议,可以作为服务器或者客户端,允许同时调试多组服务和客户端,是需要开发网络通信功能的强大调试助手。
  • 以下是引用Chen_TS在2021-02-02 19:03:15的发言 >...第一种情况:我的PLC做TCP服务器,网络调试助手做TCP客户端,没问题,这两者可以通信上。第二种情况:PLC做TCP客户端,网络调试助手做TCP服务器,...
  • 这里面,CAN转以太网设置为TCP Client模式,以CAN转以太网设备作为服务端,服务端IP地址为:192.168.0.7,端口号为:20001。单片机作为客户端,向服务端发起连接请求,接受来自服务端的数据。 三,客户端程序 #...
  • 我们在编写socket客户端程序时,必须要提前考虑 服务器异常 时的应对措施,服务器的动作主要有3种: (1)服务器正常,返回给客户端正常数据,也就是正常的数据业务,那么客户端的套接字变为可读,并且read返回一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,117
精华内容 16,046
热门标签
关键字:

以太网服务器和客户端