码迷,mamicode.com
首页 > 其他好文 > 详细

I/O模型

时间:2018-03-20 18:05:54      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:read   注册   示例   i/o模型   create   同步阻塞   i/o   处理   时间   

如果要实现多个socket同时工作的话,

同步阻塞 + 多线程

同步非阻塞(ioctrlsocket):通俗讲,就是每个套接字都去内核看看收没收到消息,没收到再返回

I/O模型select:

      ①集合              fd_set

      ②清空集合            FD_ZERO

      ③将Socket放入集合内       FD_SET

      ④将集合交给select管理       select()

      ⑤校验数据(谁在集合中即收到数据)FD_ISSET

优点:轮循查看集合内socket是否发生网络事件,将发生网络事件的socket留在集合内,简单方便跨平台

缺点:有个数限制(最多处理64个,在winsock2.h定义的宏,我们可以重定义,但最多不超过1024),仍然为阻塞函数(查看,拷回数据)

示例:

bool UDPINet::SelectMySocket(SOCKET sock)
{
    timeval tm;
    tm.tv_usec = 100;
    fd_set fd_sets;
    FD_ZERO(&fd_sets);
    FD_SET(sock,&fd_sets);
    select(NULL,&fd_sets,NULL,NULL,&tm);
    if(!FD_ISSET(sock,&fd_sets))//列表中没有套接字,则没收到消息,false
        return false;
    return true;
}

select函数的参数:

异步选择(消息):

         ①加载库

         ②socket

         ③bind

         ④创建窗口,注册(socket,事件,消息)WSAAsyncSelect()

优点:阻塞时间短,只有拷贝数据时阻塞

缺点:平台限制,只适用于Windows(因为它基于消息),时间消耗多(基于消息)

示例:

    MyWnd = MyWnd->GetWnd();
    //创建窗口
    if(!MyWnd->Create(NULL,"MyWnd"))
    {
        UnInitInet();
        return false;
    }
    //注册
    WSAAsyncSelect(sock,*MyWnd,NM_MESSAGE,FD_READ);

WSAAsyncSelect()的参数:

其中MyWnd为新创建的窗口,用来接收NM_MESSAGE消息

其中采用单例模型:懒汉模式:单线程

         饿汉模式:多线程

 

I/O模型

标签:read   注册   示例   i/o模型   create   同步阻塞   i/o   处理   时间   

原文地址:https://www.cnblogs.com/Lune-Qiu/p/8610148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!