1。阻塞套接字和非阻塞套接的区别,是不是仅仅在于send或recv的时候,非阻塞套接字能在不满足操作条件的时候立刻返回。而阻塞套接字必须要等到满足了操作条件并完成操作才返回,否则一直会挂起线程?2。那如果我将阻塞套接的recv和send的超时时间都设置的很短,那这时又和非阻塞套接字有什么区别呢?3。对于select函数来说,阻塞套接字和非阻塞套接字应该没区别吧?那我用select + 非阻塞套接字,是不是可以比较完美的解决阻塞套接字存在的弊端呢?4。既然这样,开发过程中还有用阻塞套接字的吗?5。winsocket的select函数,如果一直没有等到信号,windows会在一定的时间之后将它返回吗?问题有些多,谢谢大家帮忙解答。
2,你如果将阻塞套接的recv和send的超时时间都设置的很短,要是在指定的时间内,recv,send操作没完成,就会出现接收,发送数据失败。而非阻塞套接字还会发送,接收到数据
3,对于select函数,直接就用阻塞套接字就行了
4,肯定会用到阻塞套接字。比如通信过程中必须要收对方的某数据才能往下执行
5,select函数中的最后一个参数是设置超时的,如果为NULL,select将会无限阻塞,直到有网络事件发生
当然如果在设定的时间里有套接字可读或可写了,函数就返回了
非阻塞的方式是把你的SEND和RECEIVE放到另外一个线程(内部线程)处理,所以你的程序不会阻塞,当有消息返回的时候会调用回调函数来通知你,从而提高代码效率
1 这只是一个设定的问题,没有操作完成的概念,只是当没有数据的时候或者数据满载的时候,不返回零操作。即使只能做一个字节,也可以返回。而非阻塞,可以返回零。之间的区别仅此而已。2 几乎没有区别。只是需要注意返回值。3 你的设想没有错,事实就是你设想的那样。4 其实,用什么无所谓,关键看你的模型是什么样的,有的时候用阻塞的写起来稍微简单些,仅此而已。5 select函数有超时参数,超过时限无论如何都会返回。如果设定为无限时延,则一直等待,直到条件满足或错误发生。
要看select函数你传递的参数