select不懂
我有点不明白的是select在什么情况下返回啊?
在不超时的情况下select返回,是出于什么事情发生啊?
加入当前select检测两个套接字的状态,在不超时的情况下只有一个套接字的触发,另一个没有触发,请问此时select会不会返回,还是等待另一个socket,直到它返回或超时?
[解决办法]
recv,read,scanf这类函数是阻塞函数,也就是说没有得到数据是不会返回的,这就造成了一个问题,程序执行到这些函数里面的时候就一直等待,而这个时候如果要有其他的操作根本得不到响应。select函数就是为了解决这这个问题。它将很多个阻塞函数做成一个集合,只要这些函数中任何一个有数据输入了,它马上返回,然后判断是哪一个有输入,再进行相应的操作。
[解决办法]
Select 是一种静态方法,它可确定一个或多个 Socket 实例的状态。必须先将一个或多个套接字放入 IList 中,然后才能使用 Select 方法。通过调用 Select(将 IList 作为 checkRead 参数),可检查是否具有可读性。若要检查套接字是否具有可写性,请使用 checkWrite 参数。若要检测错误条件,请使用 checkError。在调用 Select 之后,IList 中将仅填充那些满足条件的套接字。
如果当前处于侦听状态,则可读意味着可成功地对 Accept 进行调用而没有阻止。如果当前已接受连接,则可读意味着有可读取的数据。这些情况下,所有的接收操作均可成功进行而没有阻止。可读性也可指示远程 Socket 是否已经关闭连接;如果连接已关闭,则对 Receive 的调用将立即返回,并返回零字节。
如果至少一个相关套接字(checkRead、checkWrite 和 checkError 列表中的套接字)符合其指定的条件,或者超过 microSeconds 参数,则无论先出现其中哪种情况,都会返回 Select。将 microSeconds 设置为 -1 会指定无限大的超时值。
如果对 Connect 进行非阻止调用,则可写意味着已经成功连接。如果已经建立连接,则可写性意味着所有的发送操作均会成功完成而没有阻止。
如果对 Connect 进行非阻止调用,则 checkerror 参数将标识尚未成功连接的套接字。
[解决办法]
很详细