详细介绍了TCP交流进程(合并代码、案件)的情况。

      最后更新:2021-11-08 23:11:06 手机定位技术交流文章

      详细介绍了TCP交流进程(合并代码、案件)的情况。

      • Tcp通信流程
        • 一、建立套接字
          • 1.套接字定义
          • 2.套接字分类
          • 三. 与网络有关的三个结构
          • 四. 创建插座的函数
          • 五. 错误函数
        • 二. 装、装、装、装、装
        • 三. 执行连接功能(供客户使用)
        • 五. 请求接受职能(服务员-最后使用)
        • 六. 数据转移(出口、出口、出口、关闭)
          • 方法一. Send ()
          • 方法 2..recv ()
          • 函数三. close ()
          • 函数 4. sshutdown ()
        • 七、TCP通信流程
          • 1.服务器端
          • 2.客户端
        • 八、TCP通信示例
          • 1.服务器端
          • 2.客户端

      在一个不同的城市 不同的街道地址
      我们都同意的一项协定或标准是,及时汇编一套网络规程的网络规则。
      TCP:
      UDP:
      HTTP:
      端口号: 识别主机应用程序( 进程) 的唯一方法 。
      为啥要分层:
      数据链接层处理附近节点之间的网络通信。
      传输水平有一个端口号码,各进程之间的通信。
      两个节点(IP)之间的网络通信在网络一级处理。
      Tcp 正在采取步骤,争取建立连接的可靠氟化系统服务
      数据流服务(Udp)

      Tcp通信流程

      一、建立套接字

      1.套接字定义

      Socket 是连接传输提供者的控点( 控点: 特定的智能指针、 单个物体的标识( 操作系统可以通过该操作系统向指定对象发送信息), 以及 Linux 系统中的网络通信和管理通过操作控点进行。

      2.套接字分类

      原始套接字( SOCK_ RAM) 、 当前套接字( SOCKET_ StREAM) 和数据包套接字( SOCK_ DGRAM) 是三种主要套接字类型 。
      (1) 原始软件包:使程序员能够管理较低级别的网络传输程序,通过原始软件包收到的数据包括一个IP头。
      (二) 流体插座:这些插座使双向、相继和可靠的数据传输成为可能,这种插座在通信前需要当事人之间的联系。
      (3) 数据包旨在提供双向数据流,但不能确保数据传输的可靠性、有序性或不重复,如《联合民主党协定》所界定的那样。
      例如,这三个套接字类别被用于 Socket 创建函数 :
      1>如果创建的是TCP/IP协议,则应使用SOCKET_STREAM,sockfd=socket(AF_INET,SOCK_STREAM,0);
      2>如果创建的是UDP协议,则应使用SOCK_DGRAM,sockfd=socket(AF_INET,SOCK_DGRAM,0);

      三. 与网络有关的三个结构

      (1)struct sockaddr

      (2)struct sockaddr_in

      注意:
      1>sin_port所填写的端口号要设置为大雨1024的数值,因为0~1024是保留端口号(例如:110,119,120是专用的)。
      2>在使用该结构体时候,sin_port、sin_addr不能直接填入数值,需要将其转化为网络字节优先顺序(即大端存放)。
      (3) 网络优先字节
      当数据在互联网上被传送到具有高位位元优先的网络时,如果在内部保留数据时偏爱低位位元数据,就会出现数据不一致的情况。
      网络的字节顺序(NBO,网络字节顺序)和主机的字节顺序(HBO,主机网络顺序)是插座网络编程中必须理解的两个主要方面。
      NBO,或网络字节顺序,是为网络数据传输而建立的一种数据格式,从高到低存储,即低的字节存储在高地址,而高的字节保存在低地址;这被称为“大端模式”。网络字节顺序消除主机字节顺序的差异。
      主机字节顺序与计算机 CPU 链接,存储数据的顺序由 CPU 管理。
      Linux系统在许多字节中的转换功能见下文。

      (4) 结构袜子插件的应用

      (5) 区分和连接 sruct sockaddr 和 sruct sockaddr_ in
      共同点:
      1>空间大小相同,都是16字节
      2>都有family属性
      3>sockaddr和sockadddr_in包含的数据都是一样的
      不同点:
      1>sockaddr用除family外的14个字节表示sa_data,而sockaddr_in把14个字节拆分成sin_port,sin_addr和sin_zero。分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。
      2>程序员不应操作sockaddr,sockaddr是给操作系统用的,程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

      使用方法:程序员将类型、ip地址和端口填充袜子ddr_ in 结构发送到 sockaddr 结构中,然后,该结构被迫传递到调用函数中作为参数。
      举例:

      四. 创建插座的函数

      启动通信的第一阶段,无论是TCP还是UDP,无论是作为客户还是作为服务器,都是构建一个综合系统。
      (1) 函数 函数 : 此函数返回文件描述的控件, 与用于创建合成单词的文件描述相对应 。
      (2)头文件:
      #include<sys/types>
      #include<sys/socket.h>

      (3) Insocket (insocket, int Soman, int type, int 协议, int 协议) 函数原型

      (4)函数参数:
      1> domain,代表所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族)
      2> type,指定套接字的类型:
      SOCKET_STREAM( 串流集)
      SOCK_DGRAM(数据集)
      SOCK_ RW (第一个套接字)
      3> protocol,常用的有 IPPROTO_TCP 、IPPTOTO_UDP、0,分别表示 TCP 传输协议、UDP 传输协议、自动推演。

      (5) 议定书:在一般概况下,您可以建立一个包含两个参数的组合: 域名和类型。 填充为零, 操作系统将自动推动协议类型编程, 主要是填充为零。 除非有两种不同的协议支持相同的地址类型和数据传输类型。 如果我们不指明要使用哪种协议, 操作系统将无法自动移动 。
      1> 参数 domain的值为AF_INET,type选择 SOCK_STREAM ,那么满足这两个条件的协议只有 TCP,所以下面两种写法是等价的:
      在tcp_socket = socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);//IPPROTO_TCP 是TCP协议。
      在 tcp_socket = socket = socket (AF_INET, SOCK_STREAM, 0; // 0 中表示适当的协议是自动外推的 。

      2> 参数 domain的值为AF_INET,type选择 SOCK_DGRAM,那么满足这两个条件的协议只有 UDP,所以下面两种写法是等价的:
      6 IPPROTO-UDP指UDP议定书协定。
      在 udp_ socket = socket = socket (AF_ INET, SOCK_DGRAM, 0) 中表示相关协议是自动外推的 。
      (6) 结果值: 原型套接字描述符, 当生成时通常大于2, 并被后端控制套接字的函数调用 。 1: 构建失败, 返回值为 0, 1, 2, 这基本上是标准输入输出包标识符。 当用户自己构建套接字时, 就不会发生这种情况 。

      当引用 Socket 函数时, Socket 执行器将构建一个 Socket,也就是说,为套接字数据结构分配存储空间。

      五. 错误函数

      perror 函数允许您将前一函数错误的原因导出到标准设备( stderr) 。
      参数所关联的字符串先打印,然后打印错误原因字符串。此错误根据全局变量错误的值选择要输出的字符串。在库函数中,有一个错误变量,每个错误的值与以字符串形式写入的错误类型相对应。当您调用“某些”函数错误时,函数重置错误值。
      使用以下示例演示潜伏函数:

      在这里插入图片描述

      二. 装、装、装、装、装

      粘结功能仅用于 TCP 服务器端端, 客户端不需要绑定软件包 。 在通过套接() 方法返回套接字描述符后, 在接受客户端连接请求之前, 必须绑住套接字, 即连接到机器的 IP 地址和端口, 然后可以在端口进行监听服务 。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 功能功能:在合成端口号上附加本地IP地址。

      (3) 函数原型:内装(固定结构的袜子 * my_addr, socklen_t addren, int sockfd)

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2 My_ addr, 包含 IP 地址和端口号的袜子ddr 指针, 通常会将袜子ddr 型号稳定地转换为袜子ddr 型号
      3 adpllen, shocklen_t, 和 att 字节, 表示支架袜子的长度, 即( strockt sockaddr) 大小 ;

      (5) 返回值:bind 返回 0,如果它成功;错误返回 1, 并更改错误编号, 也就是说, perror 函数可用于打印错误信息 。

      三. 执行连接功能(供客户使用)

      连接功能被连接的客户端程序用于设置套接字和与远程服务器建立 TCP 连接。连接功能也被客户端用于其他目的。
      连接函数是一个干扰功能, 通过 TCP 握手服务器结束三次连接。 客户端自动连接服务器, 通过 TCP 握手创建三次连接, 并自动告诉 Linux 内核完成 TCP 三次 。 如果连接为零, 返回值 - 1 。
      客户端的连接() 函数, 其函数是客户端与服务器的积极连接, 通过三次握手来建立连接, 连接是由内核而不是由此函数建立的, 它只是通知 Linux 的内核, 让 Linux 的内核自动完成 TCP 的三次握手 。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 函数函数:用于连接服务器端,并连接给定套接字(通知Linux内核,允许内核在整个TCP自动握手三次)。

      (3) 功能原型:在合同中(在袜子上,Const 区块袜子上, *serv_addr, inserv_addren);

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2serv_addr, 包含远程服务器的 IP 地址和端口号
      3serv_ addr, 其中包含远端服务器IP地址和端口号的引用长度, 即( strockt sockaddr) 大小

      (5) 返回值: 0 表示成功, 1 表示失败,错误代码记录在错误代码中, 错误代码可以使用 Perror 函数显示 。
      四. 收听模式收听模式
      此函数将套接字切换为被动监听模式, 并为套接字设置一个输入数据队列, 将服务请求存储到应用程序处理 。
      服务器是被动连接的。 举例来说, 一般来说, 移动客户服务( 类似于服务器) 正在等待客户的呼叫( 相当于客户) 。 在此过程中会引用监听( ) 方法 。
      如果作为服务器, Listen () 用于在调用套接字 () 后监听此套接字, 捆绑 (), 如果客户端在此点调用连接 () 以提交连接请求, 服务器将接受请求 。
      TCP 服务器编程中的监听功能将过程改变为服务器,并提供匹配软件包到被动连接。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 功能功能:将程序转换为服务器,并描述被动连接的必要设置。

      (三) 功能原型:至少(锁定、背书);

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2个积压,给内核排队长度。 对不起,csdn。 这个职位是我们特别报导的澳大利亚部分内容。 net/kongxian2007/article/ details/491553801。

      (5) 返回值: 0 表示成功, 1 表示失败,错误代码记录在错误代码中, 错误代码可以使用 Perror 函数显示 。
      应当指出, 监听 () 方法并不阻碍。 它所做的主要工作是建议 Linux 内核了解绑带和绑带之间的连接线长度, 然后结束监听 () 函数 。 在这种情况下, 当客户有主动连接( Contract ()) 时, Linux 内核自动完成 3 TCP 握手, 并自动存储队列中已建立的连接, 重复 。
      在这里插入图片描述
      示例:
      服务器:

      客户端

      在这里插入图片描述

      五. 请求接受职能(服务员-最后使用)

      接受功能让服务器接收客户端的连接请求。在建立连接团队后,服务器会调用接受功能,然后在等待客户端的连接请求时睡觉。
      接受 () 方法被屏蔽 : 它从已建立状态的队列中检索完成的连接( 即在三次握手后), 如果队列无法完成连接, 它会被停止, 直到队列中的用户连接从完成的连接中删除 。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 职能职能:用于接收客户连接请求。

      (3) 功能原型:在accpt (int sockfd, const brish sockaddr * cliet_addr, intcliet_addren) ;

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2 个客户端_ addr, 其中引用远程客户端的 IP 地址和端口号 。
      3 客户端_ addr, 包含远程客户端端口号的IP地址长度和端口号的引用, 即( strockt sockaddr) 大小

      (5)返回值:
      1-1: 失败, 将错误代码保存在错误代码中, 错误代码可以使用 perror 函数显示 。
      2 非负值:返回值是一个新的附加描述符,表示新的客户连接,可被解释为客户插座。
      示例:

      六. 数据转移(出口、出口、出口、关闭)

      大小_t 在不同平台上定义不同 :
      /* sparc 64 bit/
      typedef unsigned long __kernel_size_t;
      typedef long __kernel_ssize_t;
      /
      sparc 32 bit */
      typedef unsigned int __kernel_size_t;
      typedef int __kernel_ssize_t;

      方法一. Send ()

      将数据发送到连接的套接字中。 如果没有问题, 值等于所交付数据的全部数量; 否则, 返回 SOCKET_ ERROR 。
      客户端或服务器程序是否使用发送函数将数据传输到 TCP 连接的另一端。 客户端使用发送函数向服务器发送请求, 而服务器则使用发送函数向客户端提交回复 。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 函数函数:将数据发送到连接的套接字。

      (3) 功能原型: size_ t( int sockfd, const volution *buf, size_ t len, int 旗);

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2 const-volution *buf, 指待发数据
      3 个圆, 数据长度( 字节)
      4, 0 的 4 国旗, 0 : 一般而言, 与 写( ) 没有区别, 异常情况为 0
      MSG_DONTROUT:通知内核,目的地主机在本地网络上,没有检查路线。
      MSG_DONTWAIT:为单个I/O操作启用非阻塞模式。
      MSG_OB:该代码表示该电文是与外部电文一起发送的。

      (5)返回值:
      1-1: 失败, 将错误代码保存在错误代码中, 错误代码可以使用 perror 函数显示 。
      2 是 0 以上, 并重新发送实际发送的字节数 。

      注意 : Send 函数返回实际传输的字节, 这可能比用户想要发送的数据要少。 在应用程序中, Send 函数返回值应该与您要发送的字节编号( len) 比较, 当 Send 函数返回值和 len 长度不一致时应该解决这个问题 。

      方法 2..recv ()

      校正功能被客户端和服务器应用程序用于接收 TCP 连接另一端的数据。

      (1)头文件:
      #include <sys/types.h>
      #include <sys/socket.h>

      (2) 功能功能:从TCP连接的对面接收数据。

      sessage_t reciv( int sockfd, const volution *bff, size_ t nbites, int 旗) 是一个函数原型 。

      (4)函数参数:
      1 sockfd 是套接字方法返回的套接字描述符 。
      2个混为一谈的缓冲地带*buf,指数据接收缓冲地带
      3个Len,缓冲区长度,以及通常较大的缓冲区长度规格,避免了数据接收过度和数据遗漏。
      ④ flag,
      0:与读()相同,但“阅读”功能读取缓冲区的数据时,缓冲区的数据被删除,不调出缩略语。
      MSG_DONTWAIT:为单个I/O操作启用非阻塞模式。
      MSG_OB:该代码表示该电文是与外部电文一起发送的。
      MSG_PEEK:可视信息可查看,在收到数据时不会删除。
      MSG_WAITALL: 通知延迟到读取所需数据字节时。

      (5)返回值:
      1-1: 失败, 将错误代码保存在错误代码中, 错误代码可以使用 perror 函数显示 。
      2大于0,代表收到的字节数。
      转发接收分为两种情况:客户和服务器。

      函数三. close ()

      当数据操作完成后,可使用关闭()方法释放字符串,从而阻止软件包上的所有进一步数据操作。
      (1)头文件:#include <unistd.h>
      (2) 功能原型:内嵌(在袜子上);
      (3) 功能参数:袜子,待释放的包件描述符

      函数 4. sshutdown ()

      函数也关闭套接字,但与关闭不同,它只允许以一种方式停止数据传输,而在另一个方向继续数据传输。

      (1)头文件:#include <sys/socket.h>

      (2) 功能原型:在关闭时(在袜子上,如何)

      (3)函数参数:
      1 shockfd, 将关闭的套接字描述符
      2 在结束业务方面,可作出以下选择:
      0:不允许继续接收数据。
      2: 不允许无限期发送数据。
      2: 不允许无限期发送和接收数据。
      若上述行动未经批准,您可直接援引关闭功能。

      (4) 返回0值表示成功,1值表示失败,并设定匹配误差数字。

      七、TCP通信流程

      1.服务器端

      Socket. Create ()
      设置两个服务器的袜子结构
      三. Bind 软件包
      四. 监听模式, 用 Linux 内核进行三次握手 ()
      调用客户端_fd = 存取 () 五次 。
      第六,接收客户数据,客户端_fd=接受(Sockfd, NULL, NULL)。
      向客户端发送信件 (发送 (client_ fd, sendbuf, sentbuf, stren (sendbuf, 0))

      2.客户端

      Socket. Create ()
      二. 连接, 填入服务器的套接字机结构 。
      三. 活动服务端链接、呼叫连接()
      使用发送( sockfd, buf, strlen(buf), 0) 向服务器发送信件 。
      接收服务器信息( sockfd, buff, BUFFER_SIZE, 0) 。

      八、TCP通信示例

      1.服务器端

      2.客户端

      运行结果:
      启动服务器端端, 然后客户端, 然后客户端输入服务器的 IP 地址( 注意有我虚拟机器的 IP 地址, 使用 ifcong 命令) 和端口号, 当您返回到车辆时, 输入一个字符串, 输入到服务器, 点到车辆, 成功发送后, 服务器将对收到的数据信息作出反应, 显示接收成功 。
      在这里插入图片描述

      对不起, Csdn。 我不确定我能做到这一点, 但我无法做到这一点。

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

          热门文章

          文章分类