精华内容
下载资源
问答
  • Windows异步选择机制

    2010-07-25 15:44:00
    windows sockets的异步选择函数提供了消息机制网络事件选择:当使用它登记的网络事件发生时,windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。...

    发现书上已经写得很清楚了,就懒得再写了,直接从书里摘出来。以下内容摘自《windows sockets网络程序设计大全》。

    1、Unix下sockets异步事件的获得是通过调用select函数来进行查询,通常形式都是在循环内部使用select函数来进行选择。而windows sockets的异步选择函数提供了消息机制的网络事件选择:当使用它登记的网络事件发生时,windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。

    2、用来注册异步消息的函数是WSAAsyncSelect函数,其函数原型如下:

    int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);

    它请求Windows Sockets DLL在检测到套接字s上发生的网络事件lEvent时,向窗口hWnd发送一个消息wMsg。它自动地设置套接字处于非阻塞工作方式,参数lEvent由下列事件的一个或多个组合而成:

    值 含义

    FD_READ 期望在套接字s收到数据(即读准备好)时接到通知。

    FD_WRITE 期望在套接字s可发送数据(即写准备好)时接到通知。

    FD_OOB 期望在套接字s上有带外数据到达时接到通知

    FD_ACCEPT 期望在套接字s上有外来连接时接到通知

    FD_CONNECT 期望在套接字s连接建立完成时接到通知

    FD_CLOSE 期望在套接字s关闭时接到通知

    3、需要注意的是,为一个套接字发布的WSAAsyncSelect()函数调用将取消在它之前发布的WSAAsyncSelect()函数调用的作用。在上面的例子里,使用下面的代码不会做所期望的工作:第二次调用将取消第一次调用的作用,只有FD_WRITE事件发生时会用消息wMsg2来报告。

    rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);

    rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);

    根据这一特性,我们为了注销对套接字s上发生的网络事件的消息发送,就可以将参数lEvent设为0来调用它:

    rc = WSAAsyncSelect(s, hWnd,0,0);

    4、Windows Sockets DLL在一个网络事件发生后,它只给相应的应用程序发送一个消息。但是当应用程序使用函数调用隐式地允许重新发送此网络事件的消息时,应用程序的窗口函数又可能再次收到相应的消息。这些事件有:FD_READ、FD_OOB、FD_ACCEPT。

    对于FD_CONNECT和FD_CLOSE事件来说,因为它们只是一种状态(连接建立成功和连接关闭),因此不会产生多个消息。

    如果应用程序在收到FD_WRITE消息之后使用send()或sendto()调用发送数据均成功返回,那么它在以后需要再次发送数据时可以直接发送;但如果它希望再次获得一个FD_WRITE消息,则必须使用函数WSAAsyncSelect()来重新注册FD_WRITE事件。

    5、如果使用WSAAsyncSelect()函数为监听套接字设置了事件选择,那么此事件选择将同样作用于新的接收套接字。并且它们拥有相同的消息wMsg值,如果应用程序对于不同的接收套接字要求不同的消息或事件,那么它应该使用WSAAsyncSelect()函数来给接收套接字设置不同的事件选择。

    6、基本使用方法

    A.第一步是在某个套接字上注册特定的事件,通过设置lEvent为不同的值来实现。如WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE)。

    B.在窗口函数的消息循环中增加一个分支:

    case wMsg:

    switch (lParam) {

    case FD_READ:

    /* 从套接字wParam读取数据 */

    case FD_WRITE:

    /* 向套接字wParam发送数据 */

    }

    break;

    7、当套接字s上注册的网络事件(读准备好或写准备好)发生时,窗口hWnd将收到消息wMsg。消息变量wParam指示发生网络事件的套接字,变量lParam的低字描述发生的网络事件,高字包含错误码。

    展开全文
  • Windows异步通信机制概述

    千次阅读 2014-06-01 22:42:47
    windows系统中在很多

    windows系统中在很多地方都采用了异步的机制,例如socket网络编程模型(重叠IO与完成端口),设备IO(文件,socket等),多线程通信机制(临界区段,事件,互斥器,信号量)等。异步机制是现代操作系统必须要具备的机制。

    在Socket网络编程中的异步与设备IO中的异步使用异步是同一个目的,因为IO操作相对于CPU的处理来讲是非常慢的,不能让整个系统都阻塞在IO设备驱动上,所以采用异步机制是很自然的。异步机制让宝贵的CPU计算资源不会浪费在等待慢速IO上。它的行为方式很直观,用户线程在发送IO请求(Issue IO Request)后不用一直挂起,直到IO完成,而是直接返回继续执行其它任务。在设备驱动(Device Driver)完成IO请求后,会通知用户线程数据传输已完成,可以进行相关操作。Windows异步IO的过程主要有两步:1)向设备驱动发送IO请求,2)设备驱动在完成IO请求后通知用户已完成数据传输,即完成通知(Completion Notification)

    对于多线程通信机制,使用了几种技术来实现多线程的同步与互斥,这些技术的实现机制都是通过异步来实现的,例如事件实现的多线程通信,两个线程之间在需要进行数据交换的情况下,会使用事件来互相通知,A线程需要B线程数据的时候,那么它可以设置一个事件,当这个事件触发的时候(也就是B线程提供给A线程的数据已经完成的时候)A线程才会回来处理,在事件没有被触发的情况下A线程可以执行线程中的其他操作,这样可以不至于使线程A一直阻塞导致浪费系统资源。可以想象加入没有事件这样的异步机制那么A进程会始终处于组赛状态而不能执行其他的操作。

    这里专门讨论了一下Windows系统中的异步机制,举了几个实际开发中比较典型的例子,对于这些例子,后面的博文会陆续针对每一种情况进行分析,例如:多线程同步实现的几种方法,设备IO,socket网络编程的几种模型。

    异步IO的实现主要是线程在发生异步IO的时候,会向IO设备驱动程序发送一个异步IO的请求的消息,最后等设备完成后,由设备启动程序通知线程IO已经完成,可以进行下一步的操作了。在异步IO中我们需要知道如何向设备驱动程序发送异步IO请求,如何接收来自设备驱动程序的IO完成的通知。

    异步IO中主要涉及的几个函数主要是CreateFile,ReadFile和WriteFile,这几个函数通过参数的设置可以进行异步IO的设置,例如CreateFile函数,此函数用于打开一个设备,当然包括文件。当准备发送一个异步IO请求时,必须在dwFlagsAndAttributes参数中指定FILE_FLAG_OVERLAPPED标志,这样告诉系统你想要以异步的方式访问设备。

    WriteFile和ReadFile函数中有一个参数OVERLAPPED*,在进行同步操作的时候指定为NULL,异步操作的话那么需要设置这个结构的字段,然后传到这两个IO函数中。

    Overlapped提供的信息几乎覆盖了一个IO请求的方方面面,事实上,每一个IO请求都对应一个Overlapped,它是用户与设备驱动通信的通道。因此,在整个IO请求完成前,Overlapped结构必须一直有效。

    用户在用ReadFile/WriteFile向设备驱动发送IO请求后,必须仔细对函数返回值进行检查:

            1)若返回非0值,表示IO请求立即完成并返回,此时IO请求并没有进入请求队列。这对异步IO请求是完全可能的,因为系统以前可能刚好缓存(cache)了用户此时请求的内容,所以可以可以马上完成请求。

            2)若返回FALSE,则必须马上调用GetLastError进一步判断。如果GetLastError返回ERROR_IO_PENDING,表明此IO请求成功加入请求队列。如果返回其它值,表明此IO请求不能被加入请求队列,下面是常见的加入请求失败的返回值:

            ERROR_INVALID_USER_BUFFER/ERROR_NOT_ENOUGH_MEMORY 表明队列已满,无法加入新的请求。


    我们前面说过,Overlapped结构中的Internal成员是作为此次IO请求的错误码返回,所以我们可以通过检查此变量判断目前IO请求的状态。我们在发送IO请求后,如果此请求被成功加入队列,Overlapped结构中的Internal变量会被设为STATUS_PENDING

     Overlapped提供几乎所有我们需要的信息,这也充分说明了它是用户与设备驱动进行通信的通道。

    在设备驱动程序给我们传递完成IO的消息的时候,我们如何接收这些消息呢?

    用户线程必须在必要的时候收到设备驱动的完成通知(Completion Notification),以执行相关任务,不然异步IO没有任何意义。

    Windows提供四种方法来接受来自设备驱动的完成通知。

    我们可以通过OverlappedInternal成员判断IO请求的状态,所以我们可以实现一个busy loop来检查Internal的值是否为STATUS_PENDING,这不就行了么?理论上来说,当然是可以的,不过这似乎没有什么实用性。众所周知,busy loop太浪费CPU了!好不容易从慢速设备上省下来的CPU时间怎么能轻易用在空循环上?!事实上,Windows为我们提供了四种方法来接受设备驱动的完成通知,这里先介绍前三种。

      1.触发设备内核对象(Singaling a Device Kernel Object)

         ReadFile/WriteFile函数将IO请求加入请求队列前,函数会将设备内核对象设置为未触发状态(Nonsignaled)。当设备驱动完成IO请求后,驱动会将设备内核对象设为触发状态(Signaled)

      2.触发事件核心对象(Signaling an Event Kernel Object)

            现在我们知道了第一种方法没有什么实用性,不过有朋友可能又想到了解决方法!前一篇说过的,每一个IO请求都有一个对应的Overlapped结构,每一个Overlapped又都有一个hEvent成员,也就是说每一个IO请求都对应一个事件,这不就解决了么!

      3.可提醒IO(Alertable IO)

            到这里,除了第一篇的内容,前面的两种方法都可以暂时忘记了。因为这种方法跟前面的两种方法没有任何相似性。

            Windows在创建一个线程时,同时会给每个线程创建一个队列,叫做异步过程调用队列(Asynchronous Procedure Call, APC)。为了使用这个特性,我们应该用ReadFileEx/WriteFileEx函数替换原来的ReadFile/WriteFile函数。


    到这里,可提醒IO的概貌就浮现了。不过,我们不提倡使用可提醒IO,因为它太麻烦。:)

            1)用户线程必须为每一个IO请求实现一个完成函数,过多的IO请求当然会导致代码臃肿。如果共用完成函数,一个函数又难以提供足够的信息区分不同的情况,总之,麻烦。

            2)发出IO请求的线程必须处理这些请求的完成函数,如果一个线程发出过多的IO请求,该线程也必须任劳任怨的处理每一个完成函数,即使系统中有其它空闲的线程。

      4.完成端口(competition port)

    完成端口是最有效的一种解决方案。


    上面的一些机制都只是简单的叙述了一下,并不是不重视,只是全部写完篇幅太大,后续博文会一一讲解分析并实现。



           


    展开全文
  • 本程序基于windows异步消息机制,采用异步套接字WSAsoket,详细设计实现了客户端、服务器端的即时消息通讯,是做聊天室(单人聊天、多人聊天)的一个很好的例子,编程工具采用VC++(MFC),希望对有此方面需求的...
  • Windows Sockets API实现网络异步通讯

    千次阅读 2005-12-11 19:29:00
    摘要:本文对如何使用面向连接的流式套接字实现对网卡的编程以及如何实现异步网络通讯等问题进行了讨论与阐述。 一、 引言 在80年代初,美国加利福尼亚大学伯克利分校的研究人员为TCP/IP网络通信开发了一个专门用于...
    摘要:本文对如何使用面向连接的流式套接字实现对网卡的编程以及如何实现异步网络通讯等问题进行了讨论与阐述。 

      一、 引言

      在80年代初,美国加利福尼亚大学伯克利分校的研究人员为TCP/IP网络通信开发了一个专门用于网络通讯开发的API。这个API就是Socket接口(套接字)--当今在TCP/IP网络最为通用的一种API,也是在互联网上进行应用开发最为通用的一种API。在微软联合其它几家公司共同制定了一套Windows下的网络编程接口Windows Sockets规范后,由于在其规范中引入了一些异步函数,增加了对网络事件异步选择机制,因此更加符合Windows的消息驱动特性,使网络开发人员可以更加方便的进行高性能网络通讯程序的设计。本文接下来就针对Windows Sockets API进行面向连接的流式套接字编程以及对异步网络通讯的编程实现等问题展开讨论。

      二、 面向连接的流式套接字编程模型的设计

      本文在方案选择上采用了在网络编程中最常用的一种模型--客户机/服务器模型。这种客户/服务器模型是一种非对称式编程模式。该模式的基本思想是把集中在一起的应用划分成为功能不同的两个部分,分别在不同的计算机上运行,通过它们之间的分工合作来实现一个完整的功能。对于这种模式而言其中一部分需要作为服务器,用来响应并为客户提供固定的服务;另一部分则作为客户机程序用来向服务器提出请求或要求某种服务。

      本文选取了基于TCP/IP的客户机/服务器模型和面向连接的流式套接字。其通信原理为:服务器端和客户端都必须建立通信套接字,而且服务器端应先进入监听状态,然后客户端套接字发出连接请求,服务器端收到请求后,建立另一个套接字进行通信,原来负责监听的套接字仍进行监听,如果有其它客户发来连接请求,则再建立一个套接字。默认状态下最多可同时接收5个客户的连接请求,并与之建立通信关系。因此本程序的设计流程应当由服务器首先启动,然后在某一时刻启动客户机并使其与服务器建立连接。服务器与客户机开始都必须调用Windows Sockets API函数socket()建立一个套接字sockets,然后服务器方调用bind()将套接字与一个本地网络地址捆扎在一起,再调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长度。在此之后服务器就可以通过调用accept()来接收客户机的连接。

      相对于服务器,客户端的工作就显得比较简单了,当客户端打开套接字之后,便可通过调用connect()和服务器建立连接。连接建立之后,客户和服务器之间就可以通过连接发送和接收资料。最后资料传送结束,双方调用closesocket()关闭套接字来结束这次通讯。整个通讯过程的具体流程框图可大致用下面的流程图来表示:


            面向连接的流式套接字编程流程示意图
    三、 软件设计要点以及异步通讯的实现

      根据前面设计的程序流程,可将程序划分为两部分:服务器端和客户端。而且整个实现过程可以大致用以下几个非常关键的Windows Sockets API函数将其惯穿下来:

      服务器方:

    socket()->bind()->listen->accept()->recv()/send()->closesocket()

      客户机方:

    socket()->connect()->send()/recv()->closesocket()

      有鉴于以上几个函数在整个网络编程中的重要性,有必要结合程序实例对其做较深入的剖析。服务器端应用程序在使用套接字之前,首先必须拥有一个Socket,系统调用socket()函数向应用程序提供创建套接字的手段。该套接字实际上是在计算机中提供了一个通信埠,可以通过这个埠与任何一个具有套接字接口的计算机通信。应用程序在网络上传输、接收的信息都通过这个套接字接口来实现的。在应用开发中如同使用文件句柄一样,可以对套接字句柄进行读写操作:

    sock=socket(AF_INET,SOCK_STREAM,0);

      函数的第一个参数用于指定地址族,在Windows下仅支持AF_INET(TCP/IP地址);第二个参数用于描述套接字的类型,对于流式套接字提供有SOCK_STREAM;最后一个参数指定套接字使用的协议,一般为0。该函数的返回值保存了新套接字的句柄,在程序退出前可以用 closesocket(sock);函数来将其释放。服务器方一旦获取了一个新的套接字后应通过bind()将该套接字与本机上的一个端口相关联:

    sockin.sin_family=AF_INET;
    sockin.sin_addr.s_addr=0;
    sockin.sin_port=htons(USERPORT);
    bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin)));

      该函数的第二个参数是一个指向包含有本机IP地址和端口信息的sockaddr_in结构类型的指针,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网络上标识出来。需要注意的是由于1024以内的埠号都是保留的埠号因此如无特别需要一般不能将sockin.sin_port的埠号设置为1024以内的值。然后调用listen()函数开始侦听,再通过accept()调用等待接收连接以完成连接的建立:

    //连接请求队列长度为1,即只允许有一个请求,若有多个请求,
    //则出现错误,给出错误代码WSAECONNREFUSED。
    listen(sock,1);
    //开启线程避免主程序的阻塞
    AfxBeginThread(Server,NULL);
    ……
    UINT Server(LPVOID lpVoid)
    {
    ……
    int nLen=sizeof(SOCKADDR);
    pView->newskt=accept(pView->sock,(LPSOCKADDR)& pView->sockin,(LPINT)& nLen);
    ……
    WSAAsyncSelect(pView->newskt,pView->m_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE);
    return 1;
    }

      这里之所以把accept()放到一个线程中去是因为在执行到该函数时如没有客户连接服务器的请求到来,服务器就会停在accept语句上等待连接请求的到来,这势必会引起程序的阻塞,虽然也可以通过设置套接字为非阻塞方式使在没有客户等待时可以使accept()函数调用立即返回,但这种轮询套接字的方式会使CPU处于忙等待方式,从而降低程序的运行效率大大浪费系统资源。考虑到这种情况,将套接字设置为阻塞工作方式,并为其单独开辟一个子线程,将其阻塞控制在子线程范围内而不会造成整个应用程序的阻塞。对于网络事件的响应显然要采取异步选择机制,只有采取这种方式才可以在由网络对方所引起的不可预知的网络事件发生时能马上在进程中做出及时的响应处理,而在没有网络事件到达时则可以处理其他事件,这种效率是很高的,而且完全符合Windows所标榜的消息触发原则。前面那段代码中的WSAAsyncSelect()函数便是实现网络事件异步选择的核心函数。
    通过第四个参数注册应用程序感兴取的网络事件,在这里通过FD_READ|FD_CLOSE指定了网络读和网络断开两种事件,当这种事件发生时变会发出由第三个参数指定的自定义消息WM_SOCKET_MSG,接收该消息的窗口通过第二个参数指定其句柄。在消息处理函数中可以通过对消息参数低字节进行判断而区别出发生的是何种网络事件:

    void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam)
    {
    int iReadLen=0;
    int message=lParam & 0x0000FFFF;
    switch(message)
    {
    case FD_READ://读事件发生。此时有字符到达,需要进行接收处理
    char cDataBuffer[MTU*10];
    //通过套接字接收信息
    iReadLen = recv(newskt,cDataBuffer,MTU*10,0);
    //将信息保存到文件
    if(!file.Open("ServerFile.txt",CFile::modeReadWrite))
    file.Open("E:ServerFile.txt",CFile::modeCreate|CFile::modeReadWrite);
    file.SeekToEnd();
    file.Write(cDataBuffer,iReadLen);
    file.Close();
    break;
    case FD_CLOSE://网络断开事件发生。此时客户机关闭或退出。
    ……//进行相应的处理
    break;
    default:
    break;
    }
    }

      在这里需要实现对自定义消息WM_SOCKET_MSG的响应,需要在头文件和实现文件中分别添加其消息映射关系:

      头文件:

    //{{AFX_MSG(CNetServerView)
    //}}AFX_MSG
    void OnSocket(WPARAM wParam,LPARAM lParam);
    DECLARE_MESSAGE_MAP()

      实现文件:

    BEGIN_MESSAGE_MAP(CNetServerView, CView)
    //{{AFX_MSG_MAP(CNetServerView)
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_SOCKET_MSG,OnSocket)
    END_MESSAGE_MAP()

      在进行异步选择使用WSAAsyncSelect()函数时,有以下几点需要引起特别的注意:

      1. 连续使用两次WSAAsyncSelect()函数时,只有第二次设置的事件有效,如:

    WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
    WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);

      这样只有当FD_CLOSE事件发生时才会发送wMsg2消息。

      2.可以在设置过异步选择后通过再次调用WSAAsyncSelect(s,hwnd,0,0);的形式取消在套接字上所设置的异步事件。

      3.Windows Sockets DLL在一个网络事件发生后,通常只会给相应的应用程序发送一个消息,而不能发送多个消息。但通过使用一些函数隐式地允许重发此事件的消息,这样就可能再次接收到相应的消息。

      4.在调用过closesocket()函数关闭套接字之后不会再发生FD_CLOSE事件。

      以上基本完成了服务器方的程序设计,下面对于客户端的实现则要简单多了,在用socket()创建完套接字之后只需通过调用connect()完成同服务器的连接即可,剩下的工作同服务器完全一样:用send()/recv()发送/接收收据,用closesocket()关闭套接字:

    sockin.sin_family=AF_INET; //地址族
    sockin.sin_addr.S_un.S_addr=IPaddr; //指定服务器的IP地址
    sockin.sin_port=m_Port; //指定连接的端口号
    int nConnect=connect(sock,(LPSOCKADDR)&sockin,sizeof(sockin));

      本文采取的是可靠的面向连接的流式套接字。在数据发送上有write()、writev()和send()等三个函数可供选择,其中前两种分别用于缓冲发送和集中发送,而send()则为可控缓冲发送,并且还可以指定传输控制标志为MSG_OOB进行带外数据的发送或是为MSG_DONTROUTE寻径控制选项。在信宿地址的网络号部分指定数据发送需要经过的网络接口,使其可以不经过本地寻径机制直接发送出去。这也是其同write()函数的真正区别所在。由于接收数据系统调用和发送数据系统调用是一一对应的,因此对于数据的接收,在此不再赘述,相应的三个接收函数分别为:read()、readv()和recv()。由于后者功能上的全面,本文在实现上选择了send()-recv()函数对,在具体编程中应当视具体情况的不同灵活选择适当的发送-接收函数对。

       小结:TCP/IP协议是目前各网络操作系统主要的通讯协议,也是 Internet的通讯协议,本文通过Windows Sockets API实现了对基于TCP/IP协议的面向连接的流式套接字网络通讯程序的设计,并通过异步通讯和多线程等手段提高了程序的运行效率,避免了阻塞的发生。
    展开全文
  • CAsyncSocket异步机制

    千次阅读 2007-05-17 13:42:00
    当你获得了一个异步连接后,实际上你扫除了发送动作与接收动作之间的依赖性。所以你随时可以发包,也随时可能收到包。发送、接收函数都是异步非阻塞的,顷刻就能完成,所以收发交错进行着,你可以一直工作,保持很高...

    当你获得了一个异步连接后,实际上你扫除了发送动作与接收动作之
    间的依赖性。所以你随时可以发包,也随时可能收到包。发送、接收
    函数都是异步非阻塞的,顷刻就能完成,所以收发交错进行着,你可
    以一直工作,保持很高的效率。

    但是,正因为发送、接收函数都是异步非阻塞的,所以仅调用它们并
    不能保障发送或接收的完成。

    例如发送函数Send,调用它可能有3种结果:错误、部分完成、全部完
    成。其中错误又分两种情况:一种是由各种网络问题导致的失败,你
    需要马上决定是放弃本次操作,还是启用某种对策;另一种是“忙”,
    你实际上不用马上理睬。你需要调用GetLastError来判断是哪种情况,
    GetLastError返回WSAEWOULDBLOCK,代表“忙”,为什么当你Send得
    到WSAEWOULDBLOCK却不用理睬呢?因为CAsyncSocket会记得你的Send
    WSAEWOULDBLOCK了,待发送的数据会写入CAsyncSocket内部的发送缓
    冲区,并会在不忙的时候自动调用OnSend,发送内部缓冲区里的数据。
    同样,如果Send只完成了一部分,你也不需要理睬,尚未发送的数据
    同样会写入CAsyncSocket内部的发送缓冲区,并在适当的时候自动调
    用OnSend完成发送。

    与OnSend协助Send完成工作一样,OnRecieve、OnConnect、OnAccept
    也会分别协助Recieve、Connect、Accept完成工作。这一切都通过消
    息机制完成:

    在你使用CAsyncSocket之前,必须调用AfxSocketInit初始化WinSock
    环境,而AfxSocketInit会创建一个隐藏的CSocketWnd对象,由于这个
    对象由Cwnd派生,因此它能够接收Windows消息。一方面它会接受各个
    CAsyncSocket的状态报告,另一方面它能捕捉系统发出的各种SOCKET
    事件。所以它能够成为高层CAsyncSocket对象与WinSock底层之间的
    桥梁:例如某CAsyncSocket在Send时WSAEWOULDBLOCK了,它就会发送
    一条消息给CSocketWnd作为报告,CSocketWnd会维护一个报告登记表,
    当它收到底层WinSock发出的空闲消息时,就会检索报告登记表,然后
    直接调用报告者的OnSend函数。所以前文所说的CAsyncSocket会自动
    调用OnXxx,实际上是不对的,真正的调用者是CSocketWnd——它是
    一个CWnd对象,运行在独立的线程中

    展开全文
  • 该是程序是由VC6.0写的winsock聊天室,是WSAAsyncSelect基于Windows消息机制异步I/O模型。可以多人聊天,也可以和私人聊天,希望对需要winsockWSAAsyncSelect的人有用。
  • Windows Sockets API实现网络异步通讯

    千次阅读 2005-08-25 14:24:00
    三、 软件设计要点以及异步通讯的实现 根据前面设计的程序流程,可将程序划分为两部分:服务器端和客户端。而且整个实现过程可以大致用以下几个非常关键的Windows Sockets API函数将其惯穿下来: 服务器方:socket...
  • TCP异步同步机制

    2012-09-06 14:38:45
    自己封装的TCP通信的代码,调用相关函数连接并提供回调函数,当有网络数据会自动回调,就像Windows Message原理差不多~
  • 使用异步套接字模式进行Windows网络编程 上面我们使用多线程技术解决了阻塞套接字模式的阻塞问题。微软提供了另外一种不使用多线程技术解决阻塞问题的方法,即异步套接字模式。 所谓异步套接字,是指基于消息的、...
  • Windows Socket网络编程--异步套接字

    千次阅读 2010-04-03 00:54:00
    在阻塞模式下,在I/0 操作完成之前,执行操作的Windows函数会一直等待下去,不会立即返回(将控制权交换给主程序),如果这时候网络上没有数据,那么函数将会一直等待下去,该函数将会阻塞函数的执行,从而导致调用...
  • Windows异步IO模型详解

    千次阅读 2018-03-27 17:38:15
    这使得Windows Sockets应用程序开发人员可以把精力更多集中在如何处理数据的发送和接收上。 不足: 当完成一次I/O操作经历了两次Windows Sockets函数的调用。例如,当接收对方数据时,第一步,调用selcet()函数...
  • 内容摘要:本文首先介绍了同步选择机制异步选择机制的基本概念,然后通过讲述消息驱动与socket服务机制的矛盾引入了异步选择机制,接着本文结合一个实际的异步选择通信案例来具体介绍异步选择机制设计中的相关细节...
  • Node.js异步机制和基本原理

    千次阅读 2017-02-19 21:39:23
    一、Node.js优缺点 node.js是单线程。 好处就是 1)简单 2)高性能,避免了频繁的线程切换开销 ...3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低 ...node使用异步IO和事件驱动(回
  • 使用Win32API实现Windows异步串口通讯关键词: Win32API 串口通讯 使用Win32API实现Windows异步串口通讯(上)- - 目录:1. 异步非阻塞串口通讯的优点2. 异步非阻塞
  • Windows Socket 网络编程--异步套接字

    千次阅读 2010-04-03 01:01:00
     2.Windows Socket为了支持Windows消息驱动机制,它对网络事件采用基于消息的异步存取策略。  3.Windos Socket的异步选择函数WSAAsyncSelect提供了对网络事件的选择,当使用这个函数所登记过的网络事件发生时,...
  • Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些...
  • Windows消息传递机制详解

    万次阅读 多人点赞 2015-03-19 13:44:34
    Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。必须注意的是,消息...
  • 什么是.Net异步机制呢?

    千次阅读 2010-11-18 11:25:00
    什么是.Net的异步机制(Invoke,BeginInvoke,EndInvoke) - step 2   上一篇文章 ( 什么是.Net 的异步机制( 委托Delegate) - step 1 ) 中 , 我已经解释了什么是异步编程 , 那么现在我们就开始具体的说...
  • 异步I/O机制

    千次阅读 2012-07-10 14:56:35
    Linux和Windows都为异步I/O构建了大量的基础设施。本文总结了一下Linux和Windows下的异步I/O模型,并给出了一些使用这些模型的例子。    一般来说,服务器端的I/O主要有两种情况:一是来自网络的I/O;二是对...
  • libevent 网络异步通信库

    千次阅读 2013-03-02 10:29:03
    他主要作用是避免网络通信的时候一直阻塞,可以异步的并发,以达到节省资源和提升效率的作用,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等linux系统调用管理事件机制。著名分布式缓存...
  • 一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。 在重叠执行时,即使...
  • Service初探与异步消息处理机制

    千次阅读 2015-07-14 10:22:58
    至于异步消息和多线程,在功能复杂的同时用的也是越来越多,加上这几天在写Windows项目的部分里面也涉及到了异步套接字等等的异步知识,发现,进程间的通讯等等也需要重新看看。知识可能就是这样把,也许你当初把书...
  • windows消息传递机制详解

    千次阅读 多人点赞 2018-01-31 18:06:11
    Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照...
  • 异步网络模型

    千次阅读 2017-06-29 15:29:07
    异步网络模型 异步网络模型在服务开发中应用非常广泛,相关资料和开源库也非常多。项目中,使用现成的轮子提高了开发效率,除了能使用轮子,还是有必要了解一下轮子的内部构造。 这篇文章从最基础的5种I/O模型切入...
  • 异步选择(WSAAsyncSelect)模型:属于被动通知,基于消息机制,需要向Windows注册消息,当对应的网络事件发生时,向指定窗口发送指定消息。 缺点:(1)消息不安全,而且会慢,消息的过程比较复杂。(2)基于窗口,必须...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,711
精华内容 20,684
关键字:

windows网络异步机制