据我所知,windows的socket默认是阻塞模式,CAsyncSocket是非阻塞模式,CSocket是非阻塞模式的阻塞socket.阻塞非阻塞可以通过ioctlsocket函数来设置。
 
问题一:同步和异步是怎么规定的?有没有严格的要求?是不是一个请求以后,只有收到对方回应以后才可以发下一个请求,一问一答的关系?问题二:阻塞是对socket对象而言吗?我觉得阻塞是广义的,在非阻塞socket下,像gethostbyname等I/O函数起到阻塞作用。问题三:非阻塞和异步,处理起来比较复杂,但效率高。异步的是不是一定是非阻塞的(我认为是)?非阻塞的能不能做同步(我认为不能)?欢迎大家各抒己见,参与的人,人人有分!!
分不够另开帖子!!!!

解决方案 »

  1.   

    肯定不对!我可以采用异步阻塞并行模式。c/s接收发送采用阻塞模式,即发送或接收完毕send,rev才返回,但我可以发送多次,只接受一次,一次全部取出来!有没有懂得啊!??
      

  2.   

    阻塞:即锁定模式比如说,接受缓冲区空的时候,调用recv,recvfrom等函数时,程序会“阻塞”在此等待,直到有数据到受缓冲区。而非阻塞,如果接受缓冲没有数据,调用recv,recvfrom会立即返回个10035错误,而不会在那等待数据,如果接受缓冲有数据,则同阻塞方式一样的接受,不存在“它自己另开一个线程进行接收”这回事。当然,你可以自己开单独线程接受,这也是阻塞模式常用的方法。
    至于同步,一般来讲,阻塞肯定是同步的,如果你采用某种io异步模型的话,则会自动改为非阻塞,比如用事件异步,当接受缓冲有数据时,系统会产生一个FD_READ事件,告诉你“现在可以调用recv接受了”,而不必盲目的调用recv扑个空。
    其实,阻塞非阻塞是“套接字模式”的概念,而谈“异步”时,接触的应是“套接字io模型”的概念。
      

  3.   

    麻子照镜子,个人观点:
      阻塞及非阻塞是指socket所具有的两种模式。
      而同步异步则是指被call得socket api得返回时机。
      zhaolaoxin()所说是指,特定操作完成后返回。
      再者,我个人不赞成把CSocket定义为非阻塞模式的阻塞socket,不妥善,更不易于理解。虽然总所周知,它是从CAsyncSocket派生而来得,但是它默认得特性与CAsyncSocket所具有的完全不同。
     
      希望大家提出批评指教。  
        
      

  4.   

    阻塞就是函数一直等待返回值, 非阻塞是直接返回,不用管是否已经执行完成速度瓶颈就是I/O在非阻塞模式下,在winsock 2.0中增加了对套接字是否可写可读的判断
    而不象在阻塞时1.1中等待返回值或是轮询