网络—基于OSAPI

网络通讯和IP地址

  • 两台主机通过网络来传输数据,称为网络通讯

  • 一些术语

    1. 主机:Host,包含台式机、笔记本、手机等设备
    2. 网络:Internet
    3. 网络介质:Media,网线,光纤,无线局域网wifi,移动3G网络
    4. 数据:Data,一串字节
  • 网络通讯的观测

    1. 安装Wireshark,即可对网络通讯进行观测
    2. 抓:capture
    3. 包:packet,数据包
  • IP地址:Internet Protocol Address

    1. 用于标识网络上的一台主机,IP地址用4字节表示,称为IPv4
    2. 用字符串表示时,10进制,以点号分开**(0-255)**
      “192.168.1.1”
    3. 用16进制表示
      C0 A8 01 01(192.168.1.1)
  • ping命令:检测连通

    1. 不连通的三种可能性

      (1) 对方关机、离线
      (2) 己方没有连网
      (3) 对方在线,但对方屏蔽了PING服务

  • 查看自己的IP地址

    1. windows上,输入ipconfig
    2. linux下,输入ifconfig

Socket与复用技术

  • Socket概念

    两台主机进行通讯,运行不同的程序,它们都在使用网络进行数据传输,如何区分?

    Socket原意时“插座”,它形象的表示:用一根线连接两个插座,即形成一个数据通道

    每个插口用一个数字标识**(0-65535),这个数字就称为端口(port)**

  • 复用技术

    1. 待解决问题:

      多个Socket,每个Socket上同时传输着不同的数据(视频流、文件流等),但是,网线只有一根,字节是串行传输的(一个字节一个字节地发送)

    2. 解决办法:

      封包:将(IP,Port)放在包头,交替发送包

      这种在一个信道内,交叉间隔地传输数据的方案,称为**“分时复用”**

      发送方:复用Mux,将每个Socket上的数据,拆分成固定格式的小包,每个小包前面加上IP/Port,按照时间间隔,轮番发送到信道中

      接收方:解复用Demux,从信道中接收到小包,根据包头的Port,将小包还原成原始数据,再分发给不同的Socket处理

      分包目的:各Socket均匀占用网络

UDP基本用法

  • Socket的种类

    1. UDP
    2. TCP
  • UDP Socket

    1. UDP(User Datagram Protocol),用户数据报文协议,适用于局域网的主机间的通信

    2. UDP的单机测试

      发送方

      #include<iostream>
      #include"osapi/osapi.h"
      
      int main() {
      	std::cout << "发送方:port=9000\n";
          //创建Socket
      	OS_SockAddr local("192.168.51.65", 9000);
      	OS_UdpSocket sock;
      	sock.Open(local, true);
      
      	while (1) {
      		//让用户输入一段文本
      		char buf[128];
      		std::cout << ">";
      		gets_s(buf);
      		int n = strlen(buf);
      
      		//发送
      		OS_SockAddr peer("192.168.51.65", 9001);//对方地址
      		sock.SendTo(buf, n, peer);
      
      		//结束
      		if (strcmp("bye", buf) == 0) {
      			break;
      		}
      	}
      
      	//关闭Socket
      	sock.Close();
      	return 0;
      }
      

      接受方

      #include<iostream>
      #include"osapi/osapi.h"
      
      int main() {
      	std::cout << "接受方:port=9001\n";
          //创建Socket
      	OS_SockAddr local("192.168.51.65", 9001);
      	OS_UdpSocket sock;
      	sock.Open(local, true);
      
      	while (1) {
              //接受
      		char buf[128];
      		OS_SockAddr peer;//对方的地址
      		int n = sock.RecvFrom(buf, 128, peer);
      		if (n <= 0) {
      			break;
      		}
      		buf[n] = 0;
      		printf_s("Got:%s\n", buf);
      		//结束
      		if (strcmp("bye", buf) == 0) {
      			break;
      		}
      	}
      	//关闭socket
      	sock.Close();
      	return 0;
      }
      
    3. UDP多机测试

      • 使用虚拟机构造多机环境

        本机环境:Microsoft Windows 10专业版 10.0.19041

        虚拟机软件:Oracle VM VirtualBox-6.1.6

        虚拟机系统:Ubuntu20.04

        配置参照:

        问题:通过ifconfig查看IP地址,若IP地址显示10.0.2.15

      解决:将网络的连接方式改为桥接网卡

      借鉴了以下内容

      VirtualBox安装Lunix系统ip地址的问题

      VirtualBox安装ubuntu系统ip地址显示10.0.2.15

      出现虚拟机Ping主机失败

      解决方案:Ubuntu虚拟机无法ping通windows,反之可以的解决办法