嵌入式学习(Day: 30 网络编程)

网络编程 
本机,本地通信:如前面说的管道/信号通信;
    open system interconnect
1、OSI 模型  ===》开放系统互联模型  ==》分为7层:   (协议,双方约定的)  (OSI/TCP模型,网络编程必问)
    理想模型  ==》尚未实现
        tftp 
        b  /etc/passwd 
        a /etc/123
        应用层  (如a.out等,)
        表示层  加密解密  gzip    (密钥)
        会话层  网络断开,连接状态,keep-close keep-alive

        传输层tcp  udp  协议  文件    视频,音频(tcp:保证可靠性,可延迟一点,不能丢包,丢包就会出现延迟(如:VNC软件);udp:(如无人机)要求实时传输,可以少量丢包;)
        网路层ip   NAT       (ip地址:如何找到对方;以及如何让对方找到你)

        链路层  交换机  数据的格式化  帧 校验(帧:多个字节组成的,数据打包,一帧即一包;校验:数据不对,直接丢弃。交换机:(如24口),这24个口,平级关系,里面有个ARM芯片,交换机是一个嵌入式设备。实时全双工通信、并发)
        物理层         100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G   (下层给上一层服务,提供基础)网线:8根线,每2根拧成一组;6类拧的麻花状更密。(网线传输:百米;目标距离较远时,用光纤);光猫:光信号(亮灭)转成电信号(高低电平)。同轴电缆:如广电的有线电视;既可以传模拟信号(电视节目),也可以数字信号(上网)。无线局域网:(4G/5G,网络);RFC,机械标准:如网口/水晶头标准。

  TCP/IP模型  ==》网际互联模型   ==》分为4层:(一般无特殊说明,就用这个)
      实用模型  ===》工业标准
      tcp/ip协议栈(即TCP/IP模型)
        应用层   ====》应用程序
        传输层   ====》端口号tcp udp
        网络层   ====》IP 地址
        接口层   ====》网卡 驱动  1GB
pcap ,,,
2、TCP/IP协议族:
    www.taobao.com ---> 192.168.0.19(DNS协议,将网址转成域名,一个省有一个DNS服务器;DNS分等级,以省为单位,国家,州)
    www.voa.com vpn  
    dns 域名解析(如:翻墙)
    DHCP(自动主机配置协议,作用:配置dns服务器)
    应用层: HTTP TFTP FTP SNMP DNS ...(HTTP:网络协议;TFTP:短距离文件传输(局域网);FTP:长距离文件传输,支持断电续传;)
    传输层: TCP  UDP   56k猫(TCP:保证可靠传输,丢包重传;UDP:用户数据报协议,允许少量丢包,保证实时性;)
    网络层: IP  ICMP(ping) RIP OSPF IGMP ...(IP协议:功能:通过IP地址找到主机,寻找主机;ICMP:测试网络是否通,ping命令;无线路由相关协议:(RIP:最短路径;OSPF:最佳路径))
    (网络)接口层: ARP(地址转换:IP地址转换成mac)  RARP(逆向地址转换,mac地址转IP地址)  ...   ip--->mac(ip地址,mac地址(全球唯一):如交换机通过IP地址将数据分发给不同的mac地址的电脑)  
    arp,,,,
    192.160.0.112
 ========================================================

TCP编程基础知识:   
1、网络基础 ===》A B C D E 类

010 3333344444
IP地址 == 网络位 + 主机位  (网络号:类似固话的区号;)

IP地址的分类: 点分十进制   ipv4  712934(ipv4,即点分成4段,无符号int,范围42亿;ipv6正在发展阶段,还未全面使用,ipv4->ipv6,需要换网络设备,设备不兼容)
    A类:    超大规模性网络(第一段固定)
                    8    8    8    8
        1.0.0.0 - 126.255.255.255  126.1.1.1 
                                    126.1.1.2
        255.0.0.0    
        私有:
        10.0.0.0 - 10.255.255.255
        127.0.0.1
    B类:    大中规模型网络(前2段固定)
        128.0.0.0 - 191.255.255.255
        128.2.1.2  128.2.7.2
        255.255.0.0
        私有:
        172.16.0.0 - 172.31.255.255

    C类:    中小规模型网络(前3段固定,前三段是网络号,最后一段代表一个主机:实际可放100台电脑左右)
        192.0.0.0 - 223.255.255.255
        255.255.255.0
        私有:
        192.168.0.0 - 192.168.255.255
        静态路由
        192.168.0.0
        192.168.0.1  网关(本网段中最小的,是网关的地址)
        192.168.0.255 0 -255,最多链接255个设备

    D类:    组播和广播(组播:类似于网络群聊,一人发,指定的一个组的人可收;广播:一个人发,所有人必须收)
        224.0.0.0 - 239.255.255.255
        192.168.0.255 ==  255.255.255.255
        235.1.2.3
        192.168.1.0 
        192.168.0.1   网关(
        192.168.1.255 广播 ,广播地址(同一个一个网络下,最大的)

    E类:    实验
        240.0.0.0 - 255.255.255.255
        
   C 类网络:
       ip地址的前三组是网络地址,第四组是主机地址。
    二进制的最高位必须是: 110xxxxx开头
    十进制表示范围: 192.0.0.0 -223.255.255.255
    默认网络掩码:   255.255.255.0
    网络个数: 2^24 个 约 209 万个
    主机个数: 2^8  个 254 个+2 ===》1 是网关 1是广播
    私有地址: 192.168.x.x 局域网地址。
  
  sudo vim  /etc/network/interfaces   (网络配置文件)
  sudo /etc/init.d/networking restart      

    单机上网的配置:
    1、有网络接口并插入网线。
    2、有ip地址
    3、配置网络设置        (ifconfig,查看连接网络的设备的IP地址)
            ip: ifconfig ethX X.X.X.X/24 up  ifconfig ens33 192.168.0.13/24 up  255.255.255.0
            网关: route add default gw x.x.x.x 
            DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8
            测试:ping www.baidu.com         
            netstat  -anp   (查看Linux中连接网络的应用,相当于流量监控)

2、网络接口
    socket(直译为:插座)    ,套接字(1.网络设备打开的文件描述符;2.网路通信的接口函数)
    1、socket  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。socket api  application interface
    2、ip+port 地址+端口===》地址用来识别主机
                             端口用来识别应用程序(不同的应用有不同的端口号,进程号)

          port分为TCP port / UDP port  范围都是: 1-65535(端口号的范围)
          约定1000 以内的端口为系统使用。(系统级别的端口号)
            http 80   www.baidu.com
                3306
                telnet 21 (21/21,远程登陆协议)
                ssh 22
3、网络字节序 ===》大端存储(网络设备用大端存储);需要转换的有:IP和端口。
        12 00   小端   0x12345678  (小端存储:低数据位存放在内存低位;电脑为小端存储,运算速度比大端快一点)
        00 12
        192.168.0.12
        12.0.168.192

4.服务器端:(一个)

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

4.1 创建套接字描述符

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP(不稳定)
              SOCK_RAW     原始套接字  ===》IP(一般做网络工具会用)
      protocol 协议 ==》0 表示自动适应应用层协议。(一般都写0)

返回值:成功 返回申请的套接字id
        失败  -1;

4.2、关联接口

int bind(int sockfd, struct sockaddr *my_addr,socklen_t addrlen);   (服务端必须调bind,客户端:可选调(除非特别指定客户端的端口号时))         
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从
      参数1所在的描述符中取出并从参数2所在的接口
      设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认
            接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id    (sockfd)
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族   
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:     
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族 (一般是和接口函数调用的地址族相同)
          u_short           sin_port;   ///地址端口
          struct in_addr          sin_addr;   ///地址IP       
          char               sin_zero[8]; 占位
      };

      struct in_addr            (结构体套结构体,为了兼容老代码)   (通用地址结构体,互联网地址结构体)
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功 0
        失败  -1;
                                                       (UDP收发数据时是无连接的)
4.3、监听

 int listen(int sockfd, int backlog);               
    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
          backlog 允许链接的个数。
    返回值:成功  0
            失败  -1;
4.4、int accept(int sockfd, struct sockaddr *addr, 
                socklen_t *addrlen);
   功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
   参数:sockfd 套接字id
            addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量
               并传入变量地址,函数执行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,如果参数2为NULL,则该值
                     也为NULL;
                 如果参数不是NULL,&len;
                  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
                从该代码之后所有通信都基于该id

           失败  -1;

4.5、接受函数:/发送函数:

    read()/write ()   ///通用文件读写,可以操作套接字。
    recv(,0) /send(,0)      ///TCP 常用套机字读写
    recvfrom()/sendto() ///UDP 常用套接字读写
ssize_t recv(int sockfd, void *buf, size_t len,int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;
6、close()  ===>关闭指定的套接字id;

===================================================
客户端:

1、int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
         addrlen: 参数2的长度。
   返回值:成功 0
              失败 -1;

2、int send(int sockfd, const void *msg, 
        size_t len, int flags);
   功能:从msg所在的内存中获取长度为len的数据以flags
            方式写入到sockfd对应的套接字中。

   参数:sockfd:
               如果是服务器则是accept的返回值新fd
            如果是客户端则是sockfd的返回值旧fd

         msg 要发送的消息
         len 要发送的消息长度
         flags 消息的发送方式。

  返回值:成功  发送的字符长度
            失败  -1;
    

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值