第三十三篇,网络编程TCP协议通讯过程实现和函数接口

      最后更新:2022-04-14 19:45

      网络编程知识点概览
      ========================================
      1.核心知识点
      运输层的两项关键议定书。
      tcp协议:
      tcp理论
      tcp Linux 中的通信流量和界面功能
      tcp单播(点播)
      tcp双向通信
      tcp广播
      udp协议
      与乌龟有关的理论理论思想
      Linux udp 通信和界面功能的流动
      单向和双向乌迪通信
      多路复用
      Tcp对Udp 三 四 五握手

      2.引入网络编程
      温故知新
      程序间通信:mkfifo信号管道(违约反应行动),这是第一次采取反应行动,杀戮和信号/信号/信号和吸附改变了反应。忽略信号,信号音量( semget semctl semop) 共享内存( shmget shmdt shmctl) 信件队列( msggsnd msgrecv msgctl)
      以下所有通信方式只能在同一主机上进行。
      网络编程是同一主机内或各主机之间各进程之间沟通的另一种方法。


      网络中基本概念
      ========================================
      1.网络模型
      网络模式:为了更好地了解网络的通信进程,网络的通信进程被人为地分为多个层次。
      通讯规程是电脑科学家设计的游戏规则
      例如,考虑经典的战场通讯协议: 敌人来了, 烟雾。
      HTTP协议是计算机网络中使用最广泛的通信协议之一。
      FTP 协议。 传输文件的协议 。
      电信协议 远程着陆协议
      路径:确定网络数据传输的最佳方式(使用专门方法这样做)。

      有两种典型的网络模式:
      其中第一个是OSI七层模型。
      启用应用层:一些议定书必须用来构建具体应用。
      比如:HTTP协议
      FTP 协议。 传输文件的协议 。
      电信协议 远程着陆协议
      会话层启用: 创建会话、 加密数据、 解密
      显示层的效果包括数据包装和分析 http 协议(超文本传输协议)、 ftp 协议(文件传输协议) 和 Tonnet 协议(远程登录 ) 。
      传输层激活:解决使用 tcp 和 udp 协议在网络中传输数据的问题。
      激活网络层(平层):解决线路问题(数据传输的最佳方法)ip协议
      启动数据链层:网页卡驱动器应更多地了解这一级别的协议。
      物理层、网络接口和实际净卡都是网络组成部分的例子。
      第二,考虑TCP/IP模式。
      它以七层OSI模型为基础。
      应用层(应用层、届会层、总共三层)
      传输层
      网际层
      网络界面层(将数据连接和物理层结合起来)

      2.MAC地址
      您的物理互联网卡有 世界上一个独一无二的地址。
      地址协议族
      IP地址分为两类:IPV4和IPV6。
      IPV4
      例如,32位位数的IP地址:(表示小数点IP,三个小数点分为四节,每个段各一个字节,小数点不消耗存储空间,只写标签)
      IPV6
      为解决缺少IPV4地址、扩展号、128个地点的问题

      3.端口号
      作用:区分在同一主机上运行的不同网络进程。
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      程序员可以自己选择港口号,但不能在1024年内使用港口号,因为操作系统在1024年内占用了许多港口号。
      误解:港口号是程序ID吗? 不,它们是两个截然不同的想法。


      tcp协议的通信程序和接口功能
      ========================================
      一. 通讯程序/tcp协议程序
      客户端的流程
      建立套接字, 绑定您的 IP 和端口号, 连接到服务器, 发送信件, 然后关闭软件包 。
      服务器的流程
      构建套件 -- 键入您自己的 IP 和端口号 -- -- 听 -- 接受客户客户端连接请求 -- -- 发送和接收数据 -- -- 退出软件包

      2.相关的接口函数
      (1) 创建tcp插座 -- -- 购买手机
      #include <sys/socket.h>
      int socket(int domain, int type, int protocol);
      成功作为回报值
      失败 -1
      域域确定地址组的类型 。
      AF_INET IPv4 地址组
      AF_INET6 是一个 IPv6 地址组 。
      类型 - 绑带类型
      SOCK_STREAM TCP TCP 套接字/数据流套接字/ Screen 套接字
      SOCK_ DGRAM udp Socketes/ 数据集
      议定书 - 议定书延期,一般设置 0 忽略

      (2) 连接知识产权和港口号
      #include <sys/socket.h>
      //pv4 或 ipv6 在 bint 中( 嵌入锁, const streaddr* addrad, socklen_t addrage_ len) ;
      假设: int bint( 嵌入锁, 连接规则 stockaddr_ in * address, socklen_ t addr_ len) ); / 限制: int bint (嵌入锁, 连接规则 stockaddr_ in * address, socklen_ t addr_ len) ;
      假设: int bint( 嵌入锁, 连接规则 stockaddr_ in6 * 地址, 索克伦_ t 地址_ len); / 限制: int bint( 嵌入锁, 连接规则 stockaddr_ in6 * 地址, 索克伦_ t 地址_ len) ;
      0 已成功返回返回值 。
      失败 -1
      Socket - 随同文件描述符是一个参数 。
      地址 -- -- 用于持有装订所需的IP和端口号(你自己的IP和端口号)。
      IPv4和IPv6兼容通用地址结构
      {
      无签名短 sa_ family; / AF_ INET 或 AF_ INET 6 地址协议类型
      Char sa_ data [14]; // 保存 IP 和端口号
      }
      创建 sockaddr_ in/ / ipv4 地址结构( 用于持有 IPv4 地址 ) 。
      {
      sin_ famiter; // AF_INET 仓库协议
      以_addr sin_addr; // 用于存储 IPv4 地址以绑定的 IPv4 地址的结构结构
      sin_port; // 保存您想要绑定的端口号 。
      }
      struct in_addr
      {
      in_addr_t s_addr; / 最终用于持有绑定所需的 pip 地址
      }
      创建 sockaddr_ in6 //ipv6 地址结构( 用于持有 IPv6 地址) 。
      {

      }
      地址 - 地址结构的长度、 大小

      (3) 地址和港口号转换 - 大小
      字节顺序 : 这里指数据如何储存在计算机内存中, 计算机内存分为两个大小端。
      各种操作系统使用的字节顺序不同。
      例如,Ubuntu使用一个简单的序列。
      通过计算机网络发送的数据以大端序列存储。
      大顺序:高位数数据储存在低位数,低位数数据储存在高位数。
      短顺序:高字节数据存储在高地址,低字节数据保存在低地址。
      小顺序被称为主机字节顺序。
      “网络字节顺序”一词指大端序列。

      3.11 大序列序列的序列
      #include <sys/socket.h>
      #include <netinet/in.h>
      #include <arpa/inet.h>
      in_addr_t inet_addr(const char *cp);
      转换的长端序列(网络字节顺序)以返回值返回。
      字符串 ip (小端序列 pp/主机字节顺序)(参数: cp-)
      int inet_aton(const char *cp, struct in_addr *inp);
      下列数值被返回: 成功 0 失败 - 1
      Stringiip 参数: cp --)
      大型端 英寸 - - - 由 英寸 - 储存转换产生的序列
      代码参考:inet_aton("192.168.22.9",&(bindaddr.sin_addr));

      三.2 将小端序列港号转换成大端序列港口号
      uint16_t htons(uint16_t hostshort);
      h -->host  n -->network   s -->short
      返回值:转换后的大端序列端端号。
      hustshort -- -- 短端口号

      3.3 三个等级与小等级之间的顺序
      char *inet_ntoa(struct in_addr in);
      用于字符串格式的 p p,作为返回值的小端序列
      参数: 英寸- " 长尾序列 "

      三.4 将大端序列港号转换成小端序列港口号
      uint16_t ntohs(uint16_t netshort);

      (4) 联系女友 -- -- 联系服务器
      #include <sys/socket.h>
      int connect(int socket, const struct sockaddr *address, socklen_t address_len);
      返回值: 成功 0
      失败 -1
      地址 - 储存彼此的(服务器) ip 和 端口号

      (5)监听
      int listen(int socket, int backlog);
      返回值:成功 0
      失败 -1
      Socket - 随同文件描述符是一个参数 。
      积压——有多少情侣可以同时连接我?
      //允许最多5位情人(客户)同时与我(服务器)连接。

      (6) 准备答复 -- -- 接受客户连接请求
      int accept(int socket, struct sockaddr *address,socklen_t *address_len);
      返回值( 焦点、 焦点、 焦点): 成功交付了一个新的套接字文件配置配置文件 。
      新的合成是必要的, 因为服务器必须识别不同的客户端 。
      一旦每个客户端连接到服务器, 接受返回新套接字 。
      失败 -1
      Socket - 随同文件描述符是一个参数 。
      追踪对方(客户)的IP和端口号码。
      地址 - len - 地址大小; 需要针头 。
      概括接受函数的特性。
      特性1: 如果客户端与服务器没有连接, 服务器将总是屏蔽接收位置 。
      如果客户端成功连接到服务器, 接受时不会屏蔽客户端 。
      特征2:客户连接成功,接受的方法将成功的客户信息(ip和端口号)自动存储到第二个参数。

      (7)收发信息
      tcp 使用两组功能传送信息,既可用于接收也可用于发送信息。
      第一组:传统读/写
      第二组:对相同的函数,使用 recrov/ send read和 reciv。
      发送信息
      ssize_t send(int socket, const void *buffer, size_t length, int flags);
      以返回值成功交付的字节
      失败 -1
      参数:前三个参数与写作参数相同。
      默认设置为 0 的标记 -- 默认设置为 0
      接收信息
      ssize_t recv(int socket, void *buffer, size_t length, int flags);
      收到作为返回值的字字节数
      "0 -"不再连接。
      失败 -1
      前三个参数与阅读参数完全相同。
      默认设置为 0 的标记 -- 默认设置为 0

      遇到的问题
      ========================================
      一种.ubuntu装置不熟悉ubuntu装置
      Ubuntu 配置两种最常用的 ubuntu 方法:
      方法一:图形用户界面设置
      详细配置见截图
      方法二:更改配置配置
      使用 vim/ etc/ network/ interface 打开此文件
      如果使用静态 IP 地址, Linux 网络将被设置为连接模式 。
      (1) 查阅/etc/网络/接口文件。
      在案文后插入以下句子(静态)。
      auto  ens33
      设置静态 IP Iface ens33 inet 状态
      配置 IP 地址 / / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址 / 地址
      网关 / 网关配置
      子网遮罩/Netmask
      dns-nameservers//域名服务器
      打开文件//etc/resolv.conf。
      创建您自己的 DNS 服务器地址 。

      (2)重启网络
      sudo /etc/init.d/networking force-reload
      sudo /etc/init.d/networking restart
      如果 IP 地址是动态的, 请以 NAT 模式配置 Linux 网络 。
      (1) 查阅/etc/网络/接口文件。
      在本文件之后插入以下句子(事态发展)。
      auto  ens33
      Iface ens 33 inet dhcp// 配置动态
      你不再需要写它了。


      两张债券断了 这个问题还在地址里
      问题一:
      Cannot assign requested address
      原因是这无疑是你的IP地址 是不对的
      解决方法:
      方法一:在代码中,将ip地址改为正确的ip地址。
      方法二: Linux 包含一个 INADR_ANY 宏定义, 以自动配置本地主机上的任何 IP 地址 — 使用函数 htonl () 进行自适应 。
      原型函数: 昆特32_t htonl (昆特32_t hostalong);
      我不知道你在说什么,sin_addr.s_addr=inet_addr (),写一个:使用指定的 ip 地址绑定 。
      写入 2: 没有指定 IP 绑定 。 我不太清楚您的意思, sin_ addr. s_addr=htonl (INADR_ANY) 。

      问题二:
      Address already in use
      其原因是Ubuntu系统有一个机制,如果您的程序意外关闭,则不会立即发布港口号(将推迟约30秒)。
      解决方法:
      方法一:等待30秒不是一个好主意。
      方法二:修改代码(主函数交叉引用),然后修改端口号 — — 稍好一些。
      方法三:使用Setsockopt () 方法告诉设置要继续重复端口号 。
      int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);
      比如:
      int on=1;
      setsockopt(tcpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
      请记住,该代码只能在套接字后和捆绑前使用。



      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类