必须这样,要用WINSOCK2就必须这样,你可以自己封装一个类实现事件驱动。

解决方案 »

  1.   

    可以用WSAAsyncSelect(.......),给他个回调涵数来处理消息,不用去循环检查,只要一次绑定,以后只要有事件(FD_READ,FD_ACCEPT.....)来了,他自己会产生你自定义的消息,从而引发你的回调涵数.
    如果不会WSAAsyncSelect()的话,用select()也可以,也不用循环检查.
    例子:
    #define WM_USER+100 WM_MYMSG       //定义自己的消息
    main()
    {
        ...........
        ...........
        WSAAsyncSelect( sock,
                        this->m_hwnd,          //窗口句柄
                        WM_MYMSG,               //自定义的消息
                        FD_READ|FD_ACCEPT|FD_CLOSE );      //监视的事件
    }CALLBACK winproc(.................)
    {
        switch(WSAGETSELECTEVENT(lParam))
        {
           case FD_READ:
           case FS_ACCEPT:
           ..............
        }
    }
    不过这个适合于窗口编程,如果你想用在DOS下的话,建议用select(),大同小异的.
      

  2.   

    通过消息来产生,需不用自己去检查事件,使用WSAAsyncSelect注册了事件后,当有数据到达,会发生FD_READ消息,只要处理这个消息就可以了。现样,FD_WRITE,FD_CLOSE等也一样。
      

  3.   

    请问:风之克利斯
    异步Socket和同步Socket的区别?
      

  4.   

    sorry.
    这个概念倒是不太清楚了,
      

  5.   

    同步socket,当你进行一次recv or send 操作,由于某种原因(例如,数据未到达),程序会阻塞在
    那里.导致其他操作不能进行下去.
    异步socket,程序不会阻塞,recv会立即返回(可能会是失败),等真正数据到达后,再通过某种机制
    通知你.
      

  6.   

    你的消息循环呢?
    GetMessage
    TranslateMessage
    DispatchMessage
      

  7.   

    用WSAAsyncSelect()
    当然你要产生个窗口出来
      

  8.   

    开一个线程,所有的接收也发送都阻塞在Select.
      

  9.   

    多谢大家,不过小弟还有一个问题:select函数是工作在阻塞模式吗?比如我调用了select函数但在该socket上什么也没有发生,select函数会立即返回吗?但如果是立即返回,那我怎么知道数据什么时候到达,那还是得用
    一个循环来检测啊?
      

  10.   

    可以用 IOCompletePort + Thread pool 来管理所有的socket通信,这是Windows下最好的SocketI/O模型。
      

  11.   

    to loseworld:
       我也初学,我认为select函数是工作在阻塞模式
       若在windows下,为何不用WSAAsyncSelect?
      

  12.   

    明白了,Select 函数实际是工作在阻塞模式下,在该模式下直到选定的事件发生,否则Select 函数是不会返回的。
      

  13.   

    能够提供一个比较完整的例子吗?最好是实际应用过的。
    我的email:[email protected]