网络编程------day02并发服务器与多路复用、UDP通信

 

目录

TCP

    select与POLL概念:

     select与POLL区别:

        select函数原型及参数用法: 

                         相关头文件:

                         select函数原型:

                         select函数参数解释:

                 对select函数对应的操作函数如下:

                        关于为什么该集合只能装入1024个文件描述符,在Linux内核中有相关的解释定义如下:

        poll 函数原型及参数用法:

                         相关头文件:

                        函数原型:

                       函数参数:

 阻塞IO 和 非阻塞IO

        文件描述符特性的修改函数:

 UDP与TCP数据传输区别:

         UDP接收数据函数原型及用法:

                         接收数据函数原型及参数解释

                         接收数据函数头文件:

                        UDP发送数据函数原型及其用法: 

                         发送函数函数原型及参数解释:

                          发送数据函数头文件:

 代码区:

 TCP基础服务器的建立(普通的并发服务器):

线程服务器的建立:

线程客户端的建立: 

TCP客户端的建立与并发服务器一套: 

 UDP发送与接收数据

附录:关于链表存储数据的基本函数: 


时隔4个月,再次迎来更新

========================================================================
day02

========================================================================
回顾:
    IP地址:
        ABCDE类
    子网掩码:一种用于减少IP浪费,细化IP分类,判断若干个网络是否在同一局域网内的机制 
    默认网关:网络间的连接器
    DNS:
    数据如何打包为帧:
    OSI:7层: 物数网传会表应
                            物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
         4层: 应用层  传输层   网络层   网络接口层
                                 数据 --》 http+数据 --》 tcp+http+数据 --> ip+tcp+http+数据 --> 前导码+帧头 + ip+tcp+http+数据  + 帧尾
            

    网络数据传输的过程(简略详情回看day01)
                    起始机  ---》 路由器 ---》... --》路由器 ---》  目标机
    前导码+帧头 + ip+tcp+http+数据  + 帧尾
    ====》 路由器 
        
    TCP编程
    三次握手,四次挥手
    
TCP socket编程需要用到的函数(必要):
    server: socket  bind  listen  accept  close 
    client: socket  (bind)  connect  close 
    
=========================================================================


TCP


    并发服务器:(xiang)

             为了同时处理多个客户的数据
     主要手段有如下   
                    * 开进程
                    * 开线程
                    * 多路复用(select  poll)
        
    此次重点在于多路复用    select与poll


    select与POLL概念:

         用于监听集合中的某个文件描述符是否有信号发生的函数,select和poll是基于轮询实现的,将文件描述符从用户空间复制到内核空间,然后让内核空间以poll机制来进行轮询,一旦有其中一个fd对应的设备活跃了,那么就把整个fd_set返回给客户端(复制到用户空间),再由客户端来轮询每个fd的,找出发生了IO事件的(转developer.aliyun.com/article/763247)

     select与POLL区别:

         poll本质上和select没有区别,依然需要进行数据结构的复制,依然是基于轮询来实现,但区别就是,select使用的是fd数组,而poll则是维护了一个链表,所以从理论上,poll方法中,单个进程能监听的fd不再有数量限制。但是轮询,复制等select存在的问题,poll依然存在

        select函数原型及参数用法: 

                         相关头文件:

                                 #include
                                 #include
                                #include
                                #include

                         select函数原型:

                                        int select(int nfds, fd_set *readfds, fd_set *writefds,

                                                                fd_set *exceptfds, struct timeval *timeout);

                         select函数参数解释:

                                         nfds:文件描述符的个数(最大的文件描述符+1)
                                         readfds :读集合 
                                         writefds:写集合
                                         exceptfds:异常集合
                                         timeout: 超时
                                                        ----》 NULL  永远阻塞
                                                        ----》 struct timeval xx 倒计时
                                                                 struct timeval xx ={0,0}; ---不阻塞
                                                                 struct timeval xx ={10,0} 10s后结束阻塞

                 对select函数对应的操作函数如下:

                              void FD_CLR(int fd, fd_set *set);         //从集合中移除某个fd
                              int  FD_ISSET(int fd, fd_set *set);     //判断fd是否在集合中    是返回1,否返回0
                              void FD_SET(int fd, fd_set *set);     // 将fd加入到集合中
                              void FD_ZERO(fd_set *set);            // 清空集合

                参数:

                          fd:文件描述符

                         set:单个进程中的1024个文件描述符的集合

                返回值:

                        成功返回被响应的文件描述符

                        失败返回-1并设置errno

                        关于为什么该集合只能装入1024个文件描述符,在Linux内核中有相关的解释定义如下:

 

    #define __FD_SETSIZE    1024 
    typedef struct {
            unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
            } __kernel_fd_set;
    typedef __kernel_fd_set fd_set

    
    struct timeval {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* microseconds */
    };

 

 

      

    
    poll 函数原型及参数用法:

                         相关头文件:

                                 #include

                        函数原型:

                                int poll(struct pollfd *fds, nfds_t nfds, int timeout);

         

你可能感兴趣的:(文件IO,网络编程,tcp通信原理,服务器,c语言,tcp/ip)