网络编程学习笔记

====================================================day06============================================
***************************************************网络编程*******************************************
网络概述
6、什么是网络
    网络是一组自治的计算机,通过交换机和路由器把计算机连起来,收发数据,通信
7、网络分类
    局域网:
        以太网(主流) 令牌环网(过时) 光纤网(主干网) ATM(曾今是主流)
    城域网:
        多个以太网城域网
    广域网:
        多个城域网组成广域网

8、网络的传输介质
    双绞线:网线
    wifi:大气电磁波
    同轴电缆:曾今很主流,曾今的主干网用的很多
    光纤:单模光纤(一条信号) 多模光纤(多条信号)    
    光传输:借助光速传输信号

9、网络传输数据的格式
    电路交换:过去的制式电话,模拟信号
    报文交换:现在的数字电话,数据计算机,数字信号
    分组交换:当报文长度过长时,需要把报文分成几部分
        模拟信号:是正弦或余弦波形
        数字信号:是离散的数据
        最初都是模拟电路,后来有了大规模集成电路,形成了数字芯片,逻辑门,就有了数字电路
        不管是模拟电路还是数字电路,最后在线路上传输的都是电信号,高电平或者低电平
    
10、网络设备
    HUB:网络流量分流的设备,一分多,平均的过程
    中继器:是网络信号的再生和还原设备
    网桥:2个网络通过网桥可以连通
    交换机:交换机分为汇聚层的交换机和接入层的交换机;汇聚层的交换机称为多端口的网桥,接入层的交换机是直接连接电脑的
        交换机是各自拨号,独占带宽的;
    路由器:是存储和寻找路径的,主要的标识是IP地址,路由算法:RIP OSPF BGP
    网关:是一个抽象的概念,比如防火墙防火墙可以对流量过滤

11、主流的网络概念
    互联网:可以连接全球的网络,终端主要是电脑
    移动互联网:可以连接全球的网络但是终端是移动设备,比如智能手机等
        O2O:online to offline 线上线下
        B2C:business to client 商家到客户
        C2C:client to client 客户到客户
    物联网:万物网 M2M machine to machine 设备到设备
12、主流的网络技术
    大数据:数据挖掘和数据分析,搜索引擎
    hadoop map-reduce
    云计算:是在分布式计算和网格计算,并行计算的基础上发展起来的,openstack
    人工智能:文本,图片,音频,视频各种智能设备
13、
web:现在所有的网站都是web架构的
http:浏览器使用的网址都是http协议的
https:在http协议基础上添加了加解密算法


=============================================================day07====================================================
1、ISO 7层模型
    运用层:http https ftp tftp dns
    表示层:报文的数据结构 加密解密
    会话层:通信的逻辑 dns(把网址转化为物理ip)
    传输层:端到端 主要协议:tcp udp 主要设备:网关(以上)
    网络层:主要是ip地址 icmp igmp 主要设备:路由器
    数据链路层:以mac地址为主,传输是数据帧格式,是arp rarp 主要设备:交换机
    物理层:物理传输的介质 主要设备:HUB 中继器

2、TCP/IP的五层模型
    运用层
    传输层
    网络层
    数据链路层
    物理层

3、上面两者区别
    当ISO七层模型出现的时候,TCP/IP的五层模型已经广泛的商业化了,所以说现在市场网络产品中使用的是TCP/IP五层协议而ISO 七层模型只使用在了教学中

4、物理层
    网络的传输介质
    机械特性:产品的外形
    物理特性:高低电平
    过程特性:逻辑
    功能特性:实现的功能
5、数据链路层
    LLC:逻辑链路控制子层
    MAC:媒体接入控制子层
        随着网络的发展,LLC控制子层逐渐的弱化的,现在的数据链路层主要是指MAC媒体接入控制子层
    MAC:硬件地址 0c:84:dc:5e:bc:49  6*8=48位
        前24位:是由专门的网络机构管理的,是用来分配给公司的
        后24位:是由生产网卡的公司使用的,用来表示网卡地址,是固化在网卡的ROM中的
        
    arp协议:地址解析协议,把mac地址转换成ip地址
    rarp协议:逆地址解析协议,把ip地址转化成mac地址
    交换机:主要是根据MAC地址转发的,是在一个局域网中转发通信的
    
    交换机的广播风暴:交换机由于大量的异常数据或者病毒引起的交换机的异常拥堵,不能正常通信,这个现象称为广播风暴
    怎么避免广播风暴:划分vlan,vlan是逻辑的子网,是把交换机的网口分为几组,每一组是一个vlan,不同的vlan之间不能通信,
    这样的话就避免了交换机出现广播风暴,不同的vlan之间通信只能是借助上层(网络层)通信
    
    
6、网络层
    网络层核心是ip地址
    icmp:网络控制报文协议 ping命令是基于icmp协议封装的
    igmp:网络组报文协议    组播,广播是基于igmp协议封装的
    
    路由器:连接核心网络的设备,是找路径的;至少有两个网口,是网络链路中的一站
    ip地址分IPV4和IPV6现在主流是IPV4,IPV4是用4字节来表示ip地址,IPV6是6字节,IPV6在中国部分城市已经商业化和使用了,IPV6没有从根本上解决网络的瓶颈问题
    ip地址:有两种表示方法,
    1)点分十进制
        192.168.1.137
    2)二进制
        11000000 10101000 00000001 10001001
        192            168        1            137
    ip地址的分类:
    A类:00000000~01111111 0~127  255.0.0.0
    B类:10000000~10111111 128~191 255.255.0.0
    C类:11000000~11011111 192~223  255.255.255.0
        192.168.1.137
    D类:11100000~11101111 224~239
        主要是组播使用
    
    对于C类ip地址:网络部分加主机部分
        A类:8+24  255.0.0.0      容纳主机:2^24    
        B类:16+16  255.255.0.0    容纳主机:2^16
        C类:24+8    255.255.255.0  容纳主机:2^8
        一般说一个类型的网络能够容纳的主机个数是2^n(n是ip地址中主机的位数)
        传统意义上还有一种说法:2^n-2(减去全0和全1)
            全0:这个网络的网络地址
            全1:这个网络的广播地址
        子网掩码的定义:网络部分写1,主机部分写0,比如:
            192.168.1.137
            11111111 11111111 11111111 00000000    
            255.255.255.0 C类IP地址的子网掩码
        
    划分子网:
        一个公司有3个子公司,分别是30 50 80个人
        一个C类IP地址最多容纳2^8=256(0~255)
        192.168.1.137
        30~2^5  30最接近2^5=32 主机部分写0 后5位为0
         11111111 11111111 11111111 11100000
         255.255.255.224    
        50~2^6
         11111111 11111111 11111111 11000000
         255.255.255.192
        80~2^7
         11111111 11111111 11111111 10000000
         255.255.255.128
    划分超网:
        现在一个公司有1000人,现在有一个C类IP地址,怎么换分
        192.168.1.137
         255.255.255.0
         1111111 1111111 1111111 00000000
        1000~2^10
         1111111 1111111 1111100 00000000
         255.255.252.0
    网段:
        192.168.1.137
        C类IP地址子网掩码是255.255.255.0
        求网络地址 子网掩码和IP地址位与
        192.168.1.0 这时候说我们这个网络地址是1网段的    
        192.168.2.0 是2网段的
        我们说是192.168.1.0和192.168.2.0不是一个网段
        如果不是一个网段,如果没有添加路由,默认情况下者两个网段是不通的
    
7、传输层
    端到端的协议,端(IP+(port)),socket通信机制
    端口:常用端口:0~1023 tcp 21 http 80
          扩展端口:1024~65536 自定义端口
    
    TCP:面向字节流的,安全可靠,已连接的协议,有容错机制,提供了质量服务(QoS)
    UDP:面向数据报的,无连接的协议,只是尽最大努力交付,没有完善的可靠容错机制,游戏,音频,视频点播,使用的是UDP
    UDP发送数据有可能会丢失,网络还是好的话TCP发送数据是不会丢失的
    
    SYN:请求连接报文
    ACK:确认报文
    seq:报文的序号
    ack:希望下一次收到的报文序号
    只有TCP协议才有三次(建立连接),四次握手(断开连接)
    三次握手:(TCP)
        客户端->服务器:SYN=1,seq=x
        服务器->客户端:SYN=1,ACK=1,seq=y,ack=x+1
        客户端->服务器:ack=1,seq=x+1,ack=y+1
        
    FIN:断开连接的报文类型
    连接的时候是双向连接,断开的时候也是双向断开连接
    四次握手:(TCP)
        客户端->服务器:FIN=1,seq=u
        服务器->客户端:ACK=1,seq=v,ack=u+1
        ......
        服务器->客户端:FIN=1,seq=v+1,ack=u+1
        客户端->服务器:ACK=1,seq=u+1
    断开连接后,需要在停止2MSL的时间才真正断开连接:
     1)是因为断开连接后,需要2MSL的时间网络资源才真正释放
     2)考虑到最后一次客户->服务器的确认报文可以正确到达,如果发丢了,可以保证在2MSL的时间内重新发送c->s的确认报文,直到接收成功为止
8、运用层
现在看到的网络运用软件基本都是运用层的
主要是web架构的网络软件
    C/S架构:360,迅雷,暴风影音,爱奇艺,优酷,需要安装打开客户端的
    B/S架构:新浪,百度,搜狐,爱奇艺,优酷,直接使用浏览器的
    P2P架构:qq,微信,即时通信软件,等价于双向的C/S架构
    
9、为什么分层,为什么称为协议栈
    分层以后,结构化,模块化,层次化比较清晰,方便管理和维护,下层对上层来说相当于黑盒子,上层的改动,并不影响下层,
    多个协议层叠加在一起好像是栈结构,称为协议栈。对于两台电脑的协议栈来说,同层之间是协议,相邻层之间是接口
10、网络数据的收发过程
比如上海的一台电脑发送数据到深圳的一台电脑,"hello world",上海的电脑从运用层到物理层,对发送数据逐层添加报文头,等到达深圳的电脑时,再逐层的从物理层到运用层,去掉报文头,就得到了发送的数据"hello world"

11、网络设备中的协议栈
    5层协议栈只存在于主机电脑中,路由器中只有下3层协议
12、RFC文档
找英文全称
HTTP  超文本传输协议(HTTP,HyperText Transfer Protocol)
HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)
FTP   FTP 是File Transfer Protocol(文件传输协议)
TFTP  TFTP(Trivial File Transfer Protocol,简单文件传输协议)
TCP   TCP(Transmission Control Protocol 传输控制协议)
UDP   UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议
ICMP  ICMP是(Internet Control Message Protocol)Internet控制报文协议
IGMP  Internet 组管理协议称为IGMP协议(Internet Group Management Protocol)
ARP   地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
RARP  反向地址转换协议(RARP:Reverse Address Resolution Protocol)
[POP3 IMAP]这两个是电子邮件协议    “Post Office Protocol - Version 3”,即“邮局协议版本3”   
     IMAP(Internet Mail Access Protocol,Internet邮件访问协议)
SNMP :简单网络管理协议
DNS: 域名解析协议
每一个协议都对应一个RFC文档,www.rfc-editor.org

 

=============================================================day08=======================================================
1、几个网络命令
ifconfig:可以查看当前网络的ip地址和连接的网口
    使用方法:ifconfig
    或ifconfig eth0 (有线)
    或ifconfig wlan0(无线) wlan0是网口
ping:可以查看本机到目的机器网络是否连通
    ping 192.168.1.1
    ping www.baidu.com
    ping www.baidu.com -c 4(-c可以指定ping的次数)
traceroute:可以查看本机到目的机器的路由路径
    traceroute www.baidu.com
route -n:可以产看本机的路由表
2、wireshark
安装:sudo apt-get install wireshark
如果提示没有这个安装包则执行命令sudo apt-get update
运行:sudo wireshark
通过wireshark验证ping和3次握手,4次握手

3、字节序
小端字节序:是数据的高位存储在地址的高位,数据的地位存储在地址的地位
大端字节序:和小端字节序相反
0x12345678:存放顺序如下
         1000 1001 1002  1003
 小端序:78      56   34    12 总共4个字节
 大端序:12   34   56    78
        
        1003 1002 1001  1000
 小端序:12   34   56    78
 大端序:78      56   34    12

intel amd cpu是小端字节序
powerpc IBM是大端字节序
arm大部分是小端字节序,也有大端字节序的
1(只) + 1()=1(双)
4(点) + 9(点)=1(点)
3(周) + 9(周)=1()

4、字节序转化函数
主机序是根据主机的CPU类型决定是小端字节序还是大端字节序,网络序是大端字节序
 #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);//网络序转化为主机序短整形
       
5、IP地址格式转化函数
    ip地址两种表示方法:点分十进制和二进制
    程序中写的ip地址是点分十进制的,网络上传输的ipo地址是二进制的
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
       int inet_aton(const char *cp, struct in_addr *inp);//把点分十进制的ip地址转化为网络的二进制ip地址

       in_addr_t inet_network(const char *cp);//把点分十进制的ip地址转化为二进制的ip地址,但是和上面转化后的二进制的存储格式不同

       char *inet_ntoa(struct in_addr in);//吧网络的二进制ip地址转化为点分十进制的ip地址
           struct in_addr
           {
               unsigned long int s_addr;
           }    
6、根据域名获取ip地址 gethostbyname.c
 #include <netdb.h>
      
       struct hostent *gethostbyname(const char *name);
       
7、根据ip地址获取域名  gethostbyaddr.c
#include <netdb.h>
       #include <sys/socket.h>       /* for AF_INET */
       struct hostent *gethostbyaddr(const void *addr,
                                     socklen_t len, int type);
                                     
                                     
struct hostent {
               char  *h_name;            /* official name of host */
               char **h_aliases;         /* alias list */   
               int    h_addrtype;        /* host address type */
               int    h_length;          /* length of address */
               char **h_addr_list;       /* list of addresses */
           }
            #define h_addr h_addr_list[0] /* for backward compatibility */

h_name:表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。                                    
h_aliases://表示的是主机的别名。www.google.com就是google他自己的别名

h_addrtype:表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
h_length:表示的是主机ip地址的长度
h_addr_list:表示的是主机的ip地址,

8、几个数据结构
//互联网类型的socket结构体
    struct sockeaddr_in
    {
        short sin_family;
        short sin_port;
        struct in_addr sin_addr;
        char zero[8];//补全
    };

//通用socke结构体
    struct sockeaddr
    {
        short family;
        char buf[14];
    };


ip地址的结构体
    struct in_addr
    {
        unsigned long int s_addr;//4
    };

    int len=0;
    len=sizeof(struct sock_in);//16
    len=sizeof(struct sockaddr);//16

在使用的时候,定义的时候使用的是struct sockaddr_in类型,这个类型中有明确的family,port,addr,而struct sockaddr类型中没有明确
的family,port,addr,但是在传参时需要转化(struct sockaddr*)struct sockaddr_in
9、socket编程
1) socket函数
     #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
       int socket(int domain, int type, int protocol);
    domain:AF_INET(ipv4)
    type:AF_STREAM(TCP) SOCK_DGRAM(UDP)
    protocol:IPPROTO_TCP IPPROTO_UDP
    返回值:成功返回socket文件描述符,出错返回-1
int sockfd:
    sockfd=socket(AF_INET,SOCK_STAREAM,0)//0是缺省
    <=>sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    sockfd=socket(AF_INET,SOCK_DGRAM,0);//
    <=>sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

2)close函数
    #include<unistd.h>
    int close(int fd);//关闭文件描述符

3)send函数
        #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t send(int sockfd, const void *buf, size_t len, int flags);
       sockfd:socket函数的返回值
       buf:发送数据的数组或结构体地址
       len:发送数据的大小
       flags:0
       返回值:成功返回发送的字节数,错误返回-1
       send(sockfd,buf,sizeof(buf),0);//socket专用
       <=>write(sockfd,buf,sizeof(buf));

4)recv函数
    #include <sys/types.h>
    #include <sys/socket.h>

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    sockfd:socket函数的返回值
    buf:接收数据的存储的buf或者结构体地址
    len:接收的数据长度
    flags:0
    返回值:
        >0:成功返回正确接收的数据的个数,
        =0:表示对端socket关闭,socket不连通了
        <0:错误返回-1
    
    recv(sockfd,buf,sizeof(buf),0);
    <=>read(sockfd,bug,sizeof(buf));
    
    send/write  recv/read

10、结构体初始化
    struct sockeaddr_in servaddr;
    memset(&servaddr,0,sizeof(servaddr));
    bzero(&servaddr,sizeof(servaddr));
    void bzero()
    {
        memset(,0,);
    }    
     #include <strings.h>
           void bzero(void *s, size_t n);

    
11、tcp socket编程
    客户端:
    socket
    connect:
    send/write
    recv/read
    close
    服务端:
    socket
    bind
    listen
    accept
    recv/read
    send/write
    close

客户端通过connect函数和服务器的accept函数经过3次握手建立连接,然后进行数据的收发

connect函数:
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int connect(int sockfd, const struct sockaddr *addr,
                       socklen_t addrlen);
    sockfd:socket函数的返回值
    addr:是struct sockaddr类型 定义的时候使用的是struct sockaddr_in类型
    addrlen:sizeof(struct sockaddr)或者sizeof(addr)
    返回值:成功返回0,错误返回-1

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

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    sockfd:socket函数的返回值
    addr:是struct sockaddr类型 定义的时候使用的是struct sockaddr_in类型
    addrlen:sizeof(addr)长度数据的地址
    返回值:成功返回一个新的文件描述符,错误返回-1
    newfd=accept(sockfd,NULL,NULL);
    如果sockfd=4,则newfd=5;

listen函数:非阻赛函数有客户端连接过来之后,在服务器端只是做一个记录,并不处理
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int listen(int sockfd, int backlog);
    sockfd:socket函数的返回值
    backlog:5~20
    返回值:成功返回0错误返回-1
    backlog是listen函数监听的客户端连接未连接队列和已连接队列的长度,但这个长度不是直接的就是5~20,在listen函数中有转化,backlog只是转化的基数
    f(x)=x^3+x^2+1 x属于(5~20)

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

    int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
    sockfd:socket函数的返回值
    addr:定义好的family port addr
    addrlen:sizeof(addr)
    返回值:成功返回0错误返回-1

 

==============================================================day09================================================================
cp ../day08/common.h .
1、udpsocket编程
1)服务器
    socket
    bind
    revfrom
    sendto
    close
2)已连接的
    socket
    connect
    send/write
    recv/read
    close
3)未连接
    socket
    sendto
    recvfrom
    close
    
1-1 recvfrom 函数
    //recvfrom函数是recv和accept函数的综合
    #include <sys/types.h>
    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
    sockfd:socket函数的返回值
    buf:接收数据存储的数组或结构体地址
    len:数组或结构体的的大小
    flags:    0
    src_addr:存储接收的客户端连接发送过来的信息,比如ip端口
    addrlen:地址传递,是sizeof(sockaddr)
    返回值:接收成功的字节数,错误返回-1

1-2 sendto函数
    //sendto相当于send和connect函数的结合
    #include <sys/types.h>
    #include <sys/socket.h>
       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
                      
    sockfd:socket函数返回值
    buf:发送数据存储的数组或结构体地址
    len:发送数据的长度
    flags:0
    dest_addr:连接的目的电脑的ip和端口的结构体的地址
    addrlen:sizeof(struct sockaddr)

2、路由协议
内部路由协议:RIP OSPF
外部路由协议:BGP

3、RIP
    是距离向量计算方法;主要是根据路由器的个数,我们认为一条路由路径只要是路由器的个数最少,RIP协议认为只是一条最好的路由路径
    距离:一个网络自己到自己的距离认为是1,相邻路由器的距离+1
    RIP路由算法:目的网络 距离 下一跳路由
    1)相邻路由器发过来信息,那么目的网络不变距离都加1,下一跳路由都是相邻路由器,此时更新的信息中,下一跳路由器都是一样的
    2)如果目的网络不一样,就填加这条路由信息
    3)如果目的网络一样,下一跳路由信息也一样,这时候不管是距离变大还是变小都需要更新路由信息
    4)如果目的网络一样,下一跳路由不一样,这时候需要比较距离,如果距离变小就更新,变大或者不变都不更新
    如果距离大于15,是16时认为网络不可达
    RIP协议只和相邻的路由器交换路由信息,每30秒更新一次不管路由信息是否有变化,如果3分钟没有收到相邻路由器发来的信息,认为路由器是不可达的
    RIP协议存在的问题:好消息传播的快,坏消息传播的慢
    RIP协议是基于UDP协议发送的,使用520端口
4、OSPF
    开放最短路径优先;是链路状态路径向量的计算方法;不单纯是根据路由器的个数,主要是整体考虑到一条路由路径的费用,带宽,时延,距离等,OSPF是找一条综合价值最好的路由路径
    1)洪泛法,全网发送副本
    2)链路状态
    3)只有链路状态发生变化时,才发送路由更新信息
    
    五种分组
    1)hello分组:keepalive(保持在线) 10秒钟发一次
    2)数据库描述分组:数据库摘要
    3)链路状态请求分组:请求返回信息
    4)链路状态更新分组:路由更新信息
    5)链路确认分组:更新信息的回应
    10秒钟发送一次,如果40秒没有收到信息,认为网络不可达;每30分钟刷新一次路由数据库
    
    OSPF协议的更新路由信息是在一个自治系统中发送的,为了减少路由信息发送数据量,把一个自治系统划分为多个区域,每两个相邻区域之间通过区域边界路由器收发数据
    OSPF是基于
    
5、RIP和OSPF的区别
    都是找一条最短的最好的路由路径,只是两者计算方法不一样,RIP最多15个路由,适用于小型的网络,OSPF适用于大型的网络
    

6、BGP
    当2个自治网络需要路由连接的时候需要使用BGP,从小的方面说城市和城市的连接需要BGP,从大的方面来说国家和国家的连接需要BGP
    为什么要使用BGP:
    1)互联网规模太大,需要划分不同的AS,划分AS的原则:方便快速查找,会产生大量的内部数据,而少量的外部数据
    2)考虑到国情和网络安全
    自治系统和自治系统之间通过自治系统边界路由器交换路由信息;而且自治系统边界路由器中保存的只是自治系统到自治系统怎么到达的路由信息,不保存具体的路由器到路由器的路由信息
    自治系统内部划分为多个区域,区域和区域之间通过区域路由器连接,此时的路由器中只保存区域到区域的路由信息
    4种BGP-4报文
    1)open
    2)update
    3)keepalive 每30秒发送一次在线信息
    4)notification
并发服务器
    多进程并发服务
    多线程并发服务
    select IO复用
7、多进程并发
    每一个客户端连接过来之后,在服务器端生成一个新的进程用来和客户端通信
    
8、多线程并发
    每一个客户端连接过来后,在服务器端生成一个新的线程用来和客户端通信
    
cp -a multiprocess/ multithread
拷贝目录加-a    


========================================================day10===================================================================
1、select IO复用
    多个客户端连接到服务器后,都阻赛在select函数,多个客户端的数据通信都是通过select 函数调用实现的;每个客户端都对应一个服务器端的socket文件描述符,系统会在内核中生成一个socket文件描述的表(数据库)select函数会循环遍历数据库,当有socket文件描述符就绪时,select就读出就绪的可读文件文件描述符,根据这些就绪的socket文件描述符跟客户端进行通信
    struct fd_set
    {        
        fd1[1024];//总的socket文件描述符
        fd2[1024];//就绪的文件描述符
    };
    fd2是fd1的子集
    
2、select函数
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
       int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
    nfds:当前最大文件描述符+1,因为是左闭右开的区间(类似于数组下标比如0~8则8+1=9)
    readfds:可读文件描述符就绪
    writefds:可写文件描述符就绪
    exceptfds:异常文件描述符就绪
    timeout:时间
        NULL:阻赛(如果没数据就一直睡眠)
        tm:阻赛一段时间
        0:不阻赛
    返回值:
        >0:返回就绪的文件描述符的个数
        =0:超时
        <0:出错 EINTR 程序中断错误
    fd_set 文件描述符集合
    
    //从set集合中删除一个文件描述符
    void FD_CLR(int fd, fd_set *set);
    //判断fd是否 set中
    int  FD_ISSET(int fd, fd_set *set);
    //添加fd到set集合中
    void FD_SET(int fd, fd_set *set);
    //清空set集合
    void FD_ZERO(fd_set *set);

    
=================================================day12=======================================
mv ./server* ./client* ./groupcast/

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值