linux网络程序设计

      最后更新:2022-03-10 14:10:38 手机定位技术交流文章

      一、TCP/IP的理论基础

      协议栈

      Linux的好处之一是,Linux的好处之一是网络配件丰富和稳定,从非谈判协议层(例如通用套接合接口和设备层)到实施许多网络协议不等。

      协议介绍

      OSI模式通常用于引入网络理论,但Linux的互联网仓储被分为互联网模式的四个层次。

      网络模型

      数据封装图

      三大层

      1、网络层

      网络层包括《互联网协议》、《互联网控制报告协议》和《地址分割协议》,《互联网协议》是作为互联网分组交换网络创建的。建立网络间交流环境。它负责从来源地和目的地地点之间的高级软件中发送称为数据报告的数据块。它提供源与目的地之间没有连接的传输服务。

      2、传输层协议

      传输控制规程和用户数据电文规程是传输层规程的例子。

      传送控制议定书(TCP)(包含在数据部分中):协定负责在网络上的用户程序之间建立对话,确保各程序之间的可靠联系,并履行下列职能:

      一. 注意对话创建请求。

      2. 要求另设一个网络讨论地点。

      三. 关于发送和接收的可靠数据

      4.适度的关闭对话

      TCP是一个重要的运输层议定书。目标是能够与其他网络节点可靠地交换数据。它指定了港口号的翻译代码 。要定位主机应用程序,完成向TCP的可靠数据传输,TCP有一个强有力的内在误差检查机制,以确保数据的完整性,它以字节为导向。顺序协议,这意味着包件中的每个字节都发出一个顺序编号,每个包件被指定一个顺序编号。

      TCP/IP协议族

      TCP/IP是一个合作通信大家庭,它能够利用网络数据通信,TCP/IP议定书小组大致分为三个部分,以简单讨论:

      1. 因特网协议书(IP)简称

      2. TCP(转让控制议定书)和UDP(用户数据报告议定书)

      3. TELNET、文件传送协议(FTP)、域名服务(DNS)和简单邮件传送方案(SMTP)等,是超越TCP和UDP的应用协议的例子。

      用户数据报告协议(UDP):UDP提供不稳定的非连接传输层服务,允许数据在源与目的之间传输,而不先建立对话,主要用于非连接应用程序,如视频点播。

      联合民主党也是一项传输层协议。它是无连接的,接收数据后,不向发送者提供确认信息。它没有指定输入包的顺序 。如果有包件损失或重型包件,或向发件人发送虚假信息,因为完成使命的费用较低,因此,它比TCP更快。

      3、应用协议层:

      其中包括Telnet、文件传输协议(FTP和TFTP)、简单的文件传输协议(SMTP)和域名服务(DNS)。

      IP协议

      数据传输、位置、路线选择和数据报告是实施伙伴的四个主要目的。

      IP的主要目标是为数据输入/产出网络提供基本算法。高层次协议的无连接传输服务,这意味着在IP将数据发送到接收站之前,传输站和接收站之间没有通信。它只是封装和传输数据。然而,发件人和接收人都没有被告知货包的状况。不处理所遇到的故障

      IP软件包分为两部分:IP协议信头和协议数据。

      socket

      在Linux,网络编程使用Socket界面完成,这是一个文件描述符。

      六个参数:

      • write              send               send to
      • read               recv               recv from

      仅支持 UDP( 发送、 接收) 。

      有三种插座:

      1. SOCK_STREAM( 流式套件)

      流体合成可提供可靠、相互联系的通信流动,它采用TCP协议,确保数据传输的准确性和顺序。

      二、数据综合(数据综合)

      数据导言具体指明了一种互不连接的服务,通过不同信息进行的数据传输混乱,不能保证可靠性或误差,它使用数据报告协议UDP。

      3. SOCK_RW(原件索克特)

      原始软件包可直接获取诸如IP或IPCMP等低层次协议,这除其他外有助于测试新的网络协议。

      地址结构(网络地址)

      Sa_ Family: 以“AF_xx”为形式的地址家庭,例如。AF_INET

      Sa_data: 14字节协议地址 。

      一般说来,方案编制的重点不是袜子数据结构操作,而是使用袜子数据结构,费用与袜子数据结构相同。

      Saddr有32个地址

      地址转换

      原因是网站地址与IP地址不同。

      IP 地址通常以数字加点表示 (),但 _addr 中使用的 IP 地址以32 位数整数表示,我们可以使用以下两个函数转换:

      • int inet_aton(const char *cp,struct in_addr *inp)
      • char *inet_ntoa(struct in_addr in)

      192.168.0.1-->char *cp

      第一个函数意味着d形式中的 a.b.c. IP 被转换为32位 IP 。第二个函数意味着32位 IP 被修改为 a.b.c.d 格式 。

      字节转换( 网络大型终端排序)

      变量的字节存储顺序可能在处理器类型之间发生变化。有些系统更高、更低,而另一些系统更低、更高,而且网络发送的数据顺序必须统一。 因此,当内部字节存储订单和网络字节顺序出现差异时,必须将其转换。

      如果我们从 0x00 开始将 0x1234abcd 写入内存, 小Endian 和大Endian 模式提供以下结果:

      地址

      0x0000

      0x0001

      0x0002

      0x0003

      big-endian

      0x12

      0x34

      0xab

      0xcd

      little-endian

      0xcd

      0xab

      0x34

      0x12

      网络的字节顺序是在 TCP/IP 中定义的数据表达格式,与特定 CPU 类型、操作系统或其他任何事项无关,用于保证在不同主机之间发送时正确理解数据。

      网络字节的大内端排序

      为什么必须转换字节?

      例如,INTEL CPU使用微小字节序列,MOTOROLA 68k系列CPU使用大字节序列,INTEL CPU使用小字节序列,MOTOOLA 68k 系列CPU使用大字节序列。MOTOROLA 向INTEL 传送16位0X1234,INTEL 解释为 0X3412。

      • #include <arpa/inet.h>
      • uint32_t htonl(uint32_t hostlong);
      • uint16_t htons(uint16_t hostshort);
      • uint32_t ntohl(uint32_t netlong);
      • uint16_t ntohs(uint16_t netshort);

      这些函数名很好记,h表示host,我不知道你在说什么 但我不确定你在说什么 但我不确定你在说什么 但我不确定你在说什么我是一个长整数32位数的长整数s 表示16位数的短整数。例如, htonl 指定将一个32位长整数从主机字节转换为网络字节。例如,知识产权地址已经改变,随时可以提供。如果主机是短字节字符串,这些程序在将参数转换为适当大小端后返回 。如果主机由很长的字节序列组成,这些函数不做转换,参数密封后,必须返回。

      ps: hton 传输数据, INTOh 接收数据

      ps: 提供了公正的字符串; 不允许有数值 。

      • 使用 htons 将未签名的短类型从主机转换为网络序列 。
      • 使用 htonl 将主机的无符号长型转换为网络序列 。
      • 将未签名的短类型从网络转换为使用 tentohs 主机序列 。
      • 将无符号长型从网络转换为带有 entohl 的主机序列 。

      IP 地址通常以数字加点表示 (),但 _addr 中使用的 IP 地址以32 位数整数表示,我们可以使用以下两个函数转换:

      • int inet_aton(const char *cp,struct in_addr *inp)
      • char *inet_ntoa(struct in_addr in)

      第一个函数意味着d形式中的a.b.c. IP被转换为32位 IP 存储在 pin 指示器中。第二个函数意味着32位 IP被转换为 a.b.c.d 格式改变的函数意味着d形式中的a.b.c. IP被转换为32位 IP 存储在 inp 指示器中。第二个函数意味着32位 IP被转换为 a.b.c.d 格式。

      二. Linux网络应用程序的设计

      以下是程序 Socket 最常用的一些函数 :

      • Socket 生成套接字
      • 绑定是一个命令,用于指定 IP 地址和插座的端口号。
      • 后,连接用于连接客户端与服务器的连接。
      • 监听听, 设定最多可以处理的连接次数, 听 () 不开始接收连接, 只设置监听模式的套接字 。
      • 接受是用于接受套接字连接的命令 。
      • send发送数据
      • recv接收数据

      Socket建立

      int socket(int family, int type, int protocol);

      地址类型:家庭

      类型类型:一组接口类型

      议定书:无障碍0

      返回值: 界面识别成功返回, 但是没有返回 NULL 。

      Socket () 打开网络通信端口, 如果成功的话, 返回类似于 Open () 的文件描述, 允许程序在网络上接收和传输数据, 仿佛它是一个读/ write 文件, 如果套接字操作失败, 则返回 1 。

      使用 IPv4 使用 AF_INET 家庭参数。

      对于TCP协议,对于类型参数,请使用Sock_STREAM。根据联合民主党议定书,联合民主党协议是一个面向自由流通的传输机制。类型参数是 Sock_DGRAM 。这是该国首次发布描述传输协议议定书参数的数据报告。指定为0即可

      Bind绑定

      int bind(int sockfd, const struct sockaddr *myaddr,socklen_taddrlen);

      设置在 Sockfd 中绑定的界面

      Myaddr: 地址空间的起始位置

      地址空间长度(多列)

      监控服务器应用程序的网络地址和端口号通常是固定的。如果客户知道服务器的 IP 和端口号, 可以连接到服务器 。因此服务器必须调用约束以约束定义的网络地址和端口号。 Bind () 成功时返回 0 。失败返回-1。

      Bind () 连接参数 sockfd 和 Myaddr, 这样网络连接所使用的文件描述可以监听 Myaddr 指定的地址和端口号 。

      因此, Scruct cockaddr * 是一种通用指针类型, Myddr 参数可以使用不同长度的不同的协议嵌套结构, 因此定义结构需要第三个参数 atdrlen 的长度 。

      无法绑定的情况

      周期结束时, 套接字配置会自动关闭 。服务器的 TCP 连接在从阴蒂接收了 FIN 段后, 具有Time_ WAIT 状态 。TCP协议规定,主动断开连接的人应在时间-时间-世界范围内。这将是第一次允许两个MSL在等待两个MSL恢复到CLOSED的地位之后,恢复到CLOSED的地位。因为我们以前用Ctrl-C 停止过服务器因此,服务器是主动终止连接的实体。在Time_WAIT 期间, 同一服务器端口无法再次被窃听 。RFC 1122规定了MSL的两分钟。然而,操作系统的性能各有不同。它通常在Linux半个泥土里重新开机。

      允许在服务器的 TCP 连接完全中断之前进行审校是公平的 。因为,由于TCP连接没有完全断开,连接(:800)也没有完全分离。我们正在重新咨询和重新广告 收听器(: 800)尽管如此,它还是同一个港口。但IP地址丌同,Connfd 指未指定给客户端的独特 IP 地址 。Listenfd 相当于通配符地址 。为解决这一问题,请使用 setockopt () 选项 SO_REUSEADD 将插座描述符改为 1 。允许生成多个插座描述符,其端口号相同,但IP地址不同。

      setsockopt

      在服务器套接字 () 和 绑定 () 调用 之间放置以下代码 :

      选项 = 1; // 选择习惯, 但属性值必须是 1 。

      setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

      听觉:一套监听界面。

      SOL_SONKET: 界面配置在哪个楼层?

      使用 SO_REUSEADD 启用重复绑定 。

      &opt:地址

      长度( 选项) :

      Sockaddr_ in 初始化

      • bzero(&servaddr, sizeof(servaddr));[起始地址,长度]
      • servaddr.sin_family = AF_INET; (IPV4)
      • servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
      • servaddr.sin_port = htons(SERV_PORT);

      第一步是净化整个结构在此之后, 请将地址类型更改为 AF_ INET 。INADD_ANY是互联网地址。此宏用于代表任何本地IP地址 。因为服务器可能有几个网页卡每张卡片上可指定许多IP地址。此配置在所有 IP 地址上都可窃听 。只有在没有客户启动连接之后,方才确定IP地址。港口号是Serv_port。我们被定义为#define。

      Accept 连接

      int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

      三方插手完成后,要接受连接, 服务器将执行 接受 () 。如果服务器在没有收到客户端的连接请求的情况下使用接受( ),等客户端连接建立后, cliaddr 是一个失败的论据。接受 () 返回客户端的地址和端口号。 adplen 参数是一个输入输出参数( 数值结果参数) 。为避免缓冲区溢出而向呼叫者提供的缓冲区长度由入境者表示。这是客户端地址结构的长度(其中可能包括也可能不包括一个完全呼叫者的缓冲区)。如果 cliaddr 参数被给定 NULL 值,你声称与客户的地址无关

      Connect连接

      int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);

      客户端必须引用连接( ) 连接服务器, 以相同格式提供连接和绑定参数, 但以下除外: 绑定参数是他们自己的地址, 而连接参数是彼此的地址。 连接( ) 成功时返回 0, 错误发生时返回 1 。

      Send发送数据

      int send(int s,const void * msg,int len,unsigned int flags);

      发送 () 用于从给定的 Socket 向其它主机发送数据。 参数是连接良好的插座, 参数 msg 是要连接的数据的内容, 参数 len 是数据长度, 参数标记通常设置为 0 。

      发送数据到发送数据

      int sendto(int s,const void *msg,int len,unsigned int flags,const struct sockaddr * to,int tolen);

      使用 Sendto () 方法从给定的 Socket 向主机发送数据 。参数已经链接到套接字。如果使用 UDP, 无需连接; 参数 msg 表示要连接的数据的内容; 参数标记通常设置为 0; 指定要传送的网络地址的参数; 参数 Telen 是 sockaddr 的结果长度 。

      Recv接收数据

      int recv(int s,void * buf,int len,unsigned int flags);

      矩形 () 用于通过所提供的 Socket 接收远程主机的数据, 并将其存储在参数 buff 对应的内存区域, 参数 len 是接收数据的最大长度, 参数标记通常被设为零 。

      数据通过校正接收。

      int recvfrom(int s,void * buf,int len,unsigned int flags,struct sockaddr * from,int * fromlen);

      参数指定要传送的网络地址, 结构袜子, 参数指定要传送的网络地址, 结构袜子, 参数指定要传送的网络地址, 结构袜子, 参数指定 sockaddr 结构长度 。

      基于TCP-服务器的框架

      1. 使用套接字 () 方法构建套接字 。
      2. 绑定 IP 地址、 端口等等。 使用绑定 () 方法套接字
      3. 使用监听 () 方法, 您可以指定可以建立的最大连接次数 。
      4. 使用接受()方法接受客户端的连接 。
      5. 使用发送() 和 rejv () 的方法传输和接收数据,或读( ) 和写( ) 来读和写数据。
      6. 关闭网络连接

      示例代码:

      TCP客户框架

      1. 使用套接字 () 方法构建套接字 。
      2. 设置对方的IP地址和连接端口特性。
      3. 使用连接() 函数连接到服务器 。
      4. 分别使用发送()和 recev()或读()和写()的方法传送和接收数据。
      5. 关闭网络连接

      示例代码:

      TCP模型

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

          热门文章

          文章分类