不知道WSAAsyncSelect内部是怎么实现的。只知道用了WSAAsyncSelect以后,socket就变成非阻塞的了。要想变成阻塞的,需要再调用一次,把它的最后一个参数设为0,再用ioctlsocket来设置非阻塞。我的问题是,这样变成非阻塞以后,socket是不是就不会再发事件消息给绑定的窗口了?只有在非阻塞模式下才能发事件消息吗?

解决方案 »

  1.   


    如果L主初学socket建议不要使用MFC 中的封装好的,建议使用API中提供的来处理阻塞、非阻塞消息来更好的理解socket中,两种模式的机制!
      

  2.   

    你用WSAAsyncSelect设置回阻塞模式以后,就没有事件通知了。
      

  3.   

    没有测试过,不过我想WSAAsyncSelect(...,0);最后一个参数是0,不像FD_ACCEPT,FD_READ,FD_WRITE,FD_CLOSE等,它们有具体的事件通知,接受连接,有数据可读,可写,连接关闭等等。为0表示是什么事件通知呢,应该就是取消,所以我认为应该就没有通知了。个人想法,没有经过测试,欢迎楼下指正
      

  4.   

    刚测试过,确实不行。变成阻塞以后,就没有事件通知了。另外,WSAAsyncSelect这个不是MFC的函数,它是windows的API。我想知道的是,在阻塞模式下,怎么知道事件的发生?
    非要单独开一个线程,在里面轮询?可是怎么轮询呢?
    我只知道ioctlsocket(m_sock, FIONREAD, &iMode)可以轮询OnReceive事件。那么其它事件呢?
    另外,如果不单独开线程呢?在主线程里面怎么知道事件发生?
    问题太多了,不好意思,呵呵
      

  5.   


    1.再调用WSAAsyncSelect()不绑定任何消息的话,socket不会再有任何消息.
    2.阻塞下基本只剩下select()