哪位Windows高手知道有没有办法知道socket当前是工作在阻塞模式还是非阻塞模式?
吐血给分!加请喝咖啡!!!!

解决方案 »

  1.   

    执行任何程序,看socket状态(停止或运行),前者为非阻塞,否则为阻塞
      

  2.   

    能说详细点吗?
    偶把具体问题描述一下:recv返回-1,错误为WSAEWOULDBLOCK,但socket是用socket()建的,没有用ioctlsocket设为非阻塞啊,为什么不阻塞接收呢?
    这个问题有点类似前面yuanrichard大侠的帖子“CSocket的Receive()函数怎么不阻塞啊”。
      

  3.   

    设置阻塞需要用WSAAsyncSelect函数。如果取消只需将此函数的后两个参数设为0即可。
      

  4.   

    没有用WSAAsyncSelect啊。
    主函数调用ioctlsocket(s,FIONBIO,&ul)就成功(ul=0),子函数就失败。
      

  5.   

    刚才说的有点不对。
    下面的建议紧供参考。
    而如果您想将某一个 socket 的 async 事件通知设定取消的话,那麽同样也是用 WSAAsyncSelect 这个函式;且第四个参数 lEvent 一定要设为 0。WSAAsyncSelect( s, hWnd, 0, 0 ) -- 取消所有 async 事件设定在这里笔者还要告诉各位一点,呼叫 WSAAsyncSelect 的同时也将此一 socket改变成「非阻拦」(non-blocking)模式。但是此时这个 socket 不能很简单地用ioctlsocket() 这个函式就将它再变回「阻拦」(blocking)模式。也就是说WSAAsyncSelect 和 ioctlsocket 所改变的「非阻拦」模式仍是有些不同的。如果您想将一个「非同步」(asynchronous)模式的 socket 再变回「阻拦」模式的话,必须先呼叫 WSAAsyncSelect() 将所有的 async 事件取消,再用 ioctlsocket() 将它变回阻拦模式。
      

  6.   

    我知道。
    但问题是我没有调用过WSAAsyncSelect或WSAEventSelect,socket为什么会工作在非阻塞模式,有其它的原因吗?