Linux 网络程序设计

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

      一、TCP/IP的理论基础

      礼宾机库、礼宾介绍、网络模型和数据封装都是礼宾机库的例子。

      • Linux的好处之一是,Linux的好处之一是网络配件丰富和稳定,从非谈判协议层(例如通用套接合接口和设备层)到实施许多网络协议不等。
      • OSI模式通常用于引入网络理论,但Linux的互联网仓储被分为互联网模式的四个层次。
      • 网络模型

      • 数据封装

      2. TCP/IP中的一致性

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

      • 因特网协议书(IP)为简称
      • TCP(转让控制议定书)和UDP(用户数据报告议定书)
      • TELNET、文件传送协议(FTP)、域名服务(DNS)和简单邮件传送程序(SMTP)等,是除TCP和UDP之外还存在的应用协议的例子。

      (1)网络层

      第一部分称为网络层。主要包括因特网协议书(IP)为简称、《互联网控制报告议定书》是一项允许在互联网上传输数据的议定书。和ARP代表地址分割协议。、因特网协议书(IP)为简称

      该协议的目的是创造一个网络间通信环境,作为基于因特网的分组交换网络,负责源与目的地主机之间传输其高级软件中称为数据电文的数据集,提供源与目的地主机之间无连接的传输服务。

      • 《互联网控制报告议定书》是一项允许在互联网上传输数据的议定书。
        • 它不是知识产权层的组成部分,但它直接与它互动,报告一些网络问题,互联网路由器可以转发错误信息或测试信息。
      • ARP代表地址分割协议。
        • ARP本身不是一个网络层,它位于IP和数据链之间,是一个将32个IP地址转换为48个实际地址的机制。

      (2)传输层协议

      第二个组成部分是传输层协议,其中包括传输控制协议和用户数据电文协议。

      • TCP代表《传输控制议定书》。
        • 该协定负责在网络用户程序之间开展对话,使各个进程能够进行连贯一致的沟通。
        • 所提供的功能如下:
          • 注意对话创建请求 。
          • 建议另建一个网络网站供讨论。
          • 可依赖的关于交付和接收的数据
          • 适度的关闭对话
      • UDP( 用户数据信件协议) :
        • UDP是无连接的,不可靠的传输服务。它使数据能够在源与目的地之间传输。相反,没有必要在传输数据之前先开始对话。它在收到数据时不向发送者提供确认信息。它没有指定输入包的顺序 。如果有包件损失或重型包件,发送者不会收到不准确的报告。它的业务费用减少,因为它以较低的费用履行职责。因此,它比TCP更快。
        • 该系统主要用于无连接应用程序。
          • 如:视频点播
        • UDP协议头

      (3)应用协议层

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

      • FTP
        • FTP(File Transport Protocol,文件传输协议是一个网络上两个计算机之间交换文件的封面。运行在TCP之上,这是一种通过因特网将文件从一台计算机转移到另一台计算机的方法。FTP 要求在客户端和服务器之间建立两个 TCP 连接。一个用于发送控制信息(通过第21个端口),另一个用于发送数据。另一个用于传输文件内容(通过端口20)。
      • TFTP
        • TFTP(Trivial File Transfer Protocol,基本的文档传输协议是客户端和服务器之间使用的协议 。提供简单和低成本的文件传输服务。TFTP协议以UDP为基础。为不可预测的数据流动转移提供服务,没有准入授权和认证制度。采用超时再传送,是为了保证数据按时到来。
        • FTP 和 TFTP 内存的区别在于两者都是文件传输协议。 FTP 是基于 TCP 的复杂文件传输协议, 而TFTP 则以 UDP 为基础, 比较简单 。
      • HTTP
        • HTTP( Hypertext 传输协议, 超文本传输协议) 是用于将超链接从万维网服务器发送到本地浏览器的传输协议。 HTTP 以 TCP 为基础 。
      • SMTP
        • SMTP(简单邮件传输协议,简单邮件传输协议)是一种基于TCP的协议,允许可靠和高效的电子邮件传输。 SMTP是一种基于FTP文件传输服务的邮件服务。
      • DHCP
        • DHCP(Dynamic Host Configuration,UDP 协议用于动态主机配置协议。以客户/服务器结构为基础。DHCP指定的IP地址可分为三类。分配要么是固定的,要么是动态的,要么是自动的。
      • Telnet
        • Telnet是一种基于 TCP 的登录和模拟工具,用户可以登录到远程计算机系统。
      • DNS
        • DNS(Domain Name System,域名系统是一个互联网域名和一个 IP 地址之间的匹配 。域名简单易记。然而,机器只知道对方的IP地址域名分辨率是指它们之间的转换过程。要解决域名问题,需要一个专门的域名解析服务器。DNS 是剖析域名的服务器 。
      • SNMP
        • SNMP(Simple Network Management Protocol,为了解决互联网上的路由器管理员问题,提议订立一个简单的网络管理协议。它符合IP、IPX、AppleTalk和其他通信协议。

      (4)IP协议

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

      IP发挥四项主要功能:

      • 数据传送
      • 寻址
      • 路由选择
      • 数据报文的分段

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

      (5)TCP协议

      TCP是一个重要的运输层议定书。目标是能够与其他网络节点可靠地交换数据。它指定了港口号的翻译代码 。要定位主机应用程序,TCP协议是一个以字节为导向的序列协议,用于完成可靠的数据传输,采用严格的内置误差测试方法,以确保数据的完整性。这意味着包件中每个字节都有一个独有的编号。它为每个包包指定一个相继编号

      3、套接字

      (1)定义

      Socket 界面用于 Linux 的网络编程 。套接字是 I/ O 界面的类型 。也是文件描述符。这是一种从过程到过程的通讯方法。它不仅允许当地装置上的流程之间进行沟通,而且还允许当地机器相互交流。它还使不同计算机的流程之间能够进行基于网络的通信。

      每个套接字都有“协议、本地地址、本地港口”的半相关描述:整个套接字都有“协议、本地地址、本地港口、远程地址、边远港口”的相关描述。Socket 还提供与打开文件函数相似的功能 。此方法返回一个整数的 Socket 描述符 。随后,将使用Socket软件进行连接建设、数据传输等工作。

      收发消息格式

      write send sendto

      read receive receivefrom

      ?

      UDP

      (2)类型

      • TCP通信是通过流体索克特(SOCK_STREAM)进行的。
        • 流体插座通过利用TCP来核查数据传输的准确性和测序,使通信流动可靠、相连。
      • UDP 通信需要套接字( SOCK_DGRAM) 。
        • 数据导言具体说明了一种非连接服务,通过独立提交材料传输数据有失正常,不能确保可靠性和完整性,并采用UDP数据报告协议。
      • 原始套件( SOCK RAW) 用于测试新网络协议的执行, 除其他外 。
        • 最初的组合可直接获取底层协议,如安全协议或国际海事委员会协议,这些协议虽然有力,但更难以使用,主要用于制定某些协议。

      (3)地址结构

      1)通用类型

      struct sockaddr

      {

      u_short sa_family;

      char sa_data[14];

      };

      • Sa_family:
        • 地址家族, 以“ AF_xx ” 形式出现。 (指定字符串) AF_ INET
      • Sa_data:
        • 14 字节的礼宾地址

      2)网络地址结构

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

      &指针——取内存地址

      size

      Saddr 是32位数的地址 。

      (4)地址转化

      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,存储在插件指示器中。

      第二步是将32位 IP 转换为 abcd 格式。

      (5)字节序转换

      各类CPU可能具有变量的不同字节存储顺序:有些系统前方高,而其他系统后后方低。低位在后,在它们面前的系统是低的。高位在后,此外,网络的数据传输命令必须前后一致。因此,当内部的字节存储订单和网络的字节顺序不匹配时,就一定要进行转换。

      如果我们从 0x00 开始将 0x1234abcd 注入记忆, 小Endian 和大Endian 模式产生以下结果:

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

      网络字节的大内端排序

      为什么必须转换字节?

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

      转换函数

      • #include
      • uint32_t htonl(uint32_t hostlong);
        • 例如, htonl 指定将一个32位长整数从主机字节转换为网络字节。例如,知识产权地址已经改变,随时可以提供。如果主机是短字节字符串,这些程序在将参数转换为适当大小端后返回 。如果主机由很长的字节序列组成,这些函数不做转换,参数密封后,必须返回。
      • uint16_t htons(uint16_t hostshort);
        • 将无符号的短类型转换为网络序列 。
      • uint32_t ntohl(uint32_t netlong);
        • 将主机的无符号长型转换为网络序列 。
      • uint16_t ntohs(uint16_t netshort);
        • 将未签名的短类型转换为主机序列 。
      • h 表示主机, n 表示网络工作, l 表示32个长整数, s 表示16个短整数。

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

      1. 以下是一些最常见的套接字编程功能:

      • (1) 建造了插座
        • 函数功能
          • 套接字
        • int socket(int family, int type, int protocol);
        • 函数说明
          • Socket () 打开网络通信端口, 如果成功的话, 返回类似于 Open () 的文件描述, 允许程序在网络上接收和传输数据, 仿佛它是一个读/ write 文件, 如果套接字操作失败, 则返回 1 。
        • 参数
          • 使用 IPv4 使用 AF_INET 家庭参数。
          • type参数
            • 将SOCK_STREAM指定为TCP议定书的面向流动的转让协议。
            • 就UDP协议而言,识别码是SOCK_DGRAM,它代表数据报告传输协议。
          • 礼宾设置
            • 指定为0即可
        • 返回值
          • 如果一切顺利,文件档案将返回。
          • 失败,返回-1;

      (2) Sockaddr_in的初始化

      • bzero(&servaddr, sizeof(servaddr));
      • servaddr.sin_family = AF_INET;
      • servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
      • servaddr.sin_port = htons(SERV_PORT);

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

      • (3)bind绑定
        • 函数功能
          • 将袜子( 设置接口) 和 Myaddr (他自己的地址) 参数捆绑起来, 这样网络通信的袜子文件描述可以听取 Myaddr 的地址和端口号描述 。
        • int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
        • 函数说明
          • 服务器应用程序的网络地址和端口号是固定的, 当知道服务器程序地址和端口号时, 客户端可以建立与服务器的连接, 因此服务器必须调用捆绑以绑定固定的网络地址和端口号 。
        • 参数
          • * Scruct sockaddr * 是一种通用指针 。
          • Myaddr 参数可以使用不同长度的多个协议套装结构。
          • 参数 addrlen 所显示的结构长度 。
        • 返回值
          • 成功时返回0,失败时返回1。
        • 无法绑定
          • 原因
          • 周期结束时, 套接字配置会自动关闭 。服务器的 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 相当于通配符地址 。
          • 解决措施:
            • 将套接字配置器选项 SO_ REUSEADD 设为 1, 带有 setockopt (), 允许创建另外的套接字描述符, 其端口号相同, 但IP 地址不同 。
            • 在服务器套接字 () 和 绑定 () 调用 之间放置以下代码 :
            • int opt = 1;

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

      • (4) 加入(前面指定的服务器地址)
        • 函数功能
          • 后,此函数用于连接客户端与服务器的链接。
        • int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
        • 与约束合同的对质合同
          • 客户必须援引连接()连接服务器,以相同格式提供连接和绑定参数,但约束参数是他们自己的地址,而连接参数是彼此的地址除外。
        • 参数
        • 返回值
          • 连接成功返回 0 。
          • 出错返回-1
      • (5) 注意(特定服务器)
        • 指定可处理的最大连接次数, Listen () 不开始接收连接, 只将套接字放在监听模式中 。
        • int listen(int sockfd,int backflag);
        • 参数
          • sockfd:
          • 后旗: 定义可同时处理的最大连接次数 。
        • 返回值
          • 成功0
          • 失败-1;
      • (6) 接受(依赖服务器)
        • 函数功能
          • 接受插接连接
        • int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
        • 函数说明
          • 当三方干预完成后,服务器电话接受()接受连接,如果服务器电话在没有客户端的连接请求的情况下接受(),则延迟到客户端连接。
        • 参数
          • 接受 () 返回客户端的地址和端口号作为输出参数, cliaddr 。
          • adpllen 参数是一个数值结果参数( 输入退出参数) 。为避免缓冲区溢出而向呼叫者提供的缓冲区长度由入境者表示。这是客户端地址结构的长度(其中可能包括也可能不包括一个完全呼叫者的缓冲区)。
          • 如果NULL提供给cliadr参数,它表示它与客户的地址无关。
        • 返回值
          • 成功:3个值
      • (7)send
        • 发送数据
        • 表头文件
          • #include
          • #include
        • int send(int s,const void * msg,int len,unsigned int flags)
        • 参数
          • s: 预存在连接的套接字套接字
          • msg:显示希望链接的数据内容
          • len:数据长度
          • 国旗:在大多数情况下为零。
            • MSSG_OB:数据调离带外传输
            • 终止路由器操作
            • MSG_DONNTWAIT: 设定为连续操作
            • MSG_NOSignal:这一活动不希望被SIGPIPE信号阻止。
        • 返回值
          • 返回成功传输的字符数。
          • 失败返回-1

      (8) 发送至方法

      • 函数: 由 Socket 将数据从指定的 Socket 传输到其他 Socket 主机 。
      • 表头文件:
          • #include
          • #include
        • int sendto(int s,const void * msg,int len,unsigned int flags,const struct sockaddr * to, int tolen)
        • 参数
          • 显示要转发的网络地址
          • 长长:索卡迪尔结果的长度
      • 返回值
          • 返回成功传输的字符数。
          • 失败返回-1
      • (9)recv
        • 接收数据

      2、基于TCP

      (1)服务器

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

      (2)客服端

      • 套接字,用函数socket()
      • 设置对方的IP地址和连接端口特性。
      • 使用连接() 函数连接到服务器 。
      • 使用发送() 和 rejv () 的方法传输和接收数据,或读( ) 和写( ) 来读和写数据。
      • 关闭网络连接

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

          热门文章

          文章分类