1。阻塞套接字和非阻塞套接的区别,是不是仅仅在于send或recv的时候,非阻塞套接字能在不满足操作条件的时候立刻返回。而阻塞套接字必须要等到满足了操作条件并完成操作才返回,否则一直会挂起线程?2。那如果我将阻塞套接的recv和send的超时时间都设置的很短,那这时又和非阻塞套接字有什么区别呢?3。对于select函数来说,阻塞套接字和非阻塞套接字应该没区别吧?那我用select + 非阻塞套接字,是不是可以比较完美的解决阻塞套接字存在的弊端呢?4。既然这样,开发过程中还有用阻塞套接字的吗?5。winsocket的select函数,如果一直没有等到信号,windows会在一定的时间之后将它返回吗?问题有些多,谢谢大家帮忙解答。

解决方案 »

  1.   

    1,阻塞套接字要等待操作完成才往下执行,非阻塞套接字不必等待操作完成,就往下执行
    2,你如果将阻塞套接的recv和send的超时时间都设置的很短,要是在指定的时间内,recv,send操作没完成,就会出现接收,发送数据失败。而非阻塞套接字还会发送,接收到数据
    3,对于select函数,直接就用阻塞套接字就行了
    4,肯定会用到阻塞套接字。比如通信过程中必须要收对方的某数据才能往下执行
    5,select函数中的最后一个参数是设置超时的,如果为NULL,select将会无限阻塞,直到有网络事件发生
      

  2.   

    select函数是判断该套接字可不可以读写,你设定多长时间它就等待多长时间
    当然如果在设定的时间里有套接字可读或可写了,函数就返回了
      

  3.   

    阻塞套接字和非阻塞套接的区别,是不是仅仅在于send或recv的时候??? 不是的,你的connect操作,也有阻塞和非阻塞的。
      

  4.   

    阻塞消息就不讲了,估计你明白。
    非阻塞的方式是把你的SEND和RECEIVE放到另外一个线程(内部线程)处理,所以你的程序不会阻塞,当有消息返回的时候会调用回调函数来通知你,从而提高代码效率
      

  5.   

    回答: 
    1   这只是一个设定的问题,没有操作完成的概念,只是当没有数据的时候或者数据满载的时候,不返回零操作。即使只能做一个字节,也可以返回。而非阻塞,可以返回零。之间的区别仅此而已。2   几乎没有区别。只是需要注意返回值。3   你的设想没有错,事实就是你设想的那样。4   其实,用什么无所谓,关键看你的模型是什么样的,有的时候用阻塞的写起来稍微简单些,仅此而已。5  select函数有超时参数,超过时限无论如何都会返回。如果设定为无限时延,则一直等待,直到条件满足或错误发生。
      

  6.   

    4.既然这样,开发过程中还有用阻塞套接字的吗?有,因为阻塞写起来比较简单5。winsocket的select函数,如果一直没有等到信号,windows会在一定的时间之后将它返回吗?
    要看select函数你传递的参数