我现在正在研究一个php websockets服务器实现来编写一个新的。
以下是接受新连接的部分:
$write = [];
$except = [];
while(isset(self::$read[0])){
$changed = self::$read;
$result = socket_select($changed, $write, $except, 1);
if($result === false){
// Error handling
}elseif($result > 0){
foreach($changed as $clientID => $socket){
if($clientID != 0){
// Read bytes
}else{
$client = socket_accept(self::$read[0]);
if($client !== false){
// Add client
}
}
}
}
// Ping idle clients
}
其中self::$read[0]
是监听新连接的主套接字。
我没有(当前也无法)对此进行彻底测试,但如果在一秒钟内有多个传入的新连接,那么socket_accept
是否只接受其中一个? socket_select
是否会在下一次迭代中再次选择主套接字,因为仍有接受连接?
答案 0 :(得分:1)
是的,socket_accept()只返回一个连接。我们可以在循环中调用select,如果有更多连接(也就是侦听器/服务器fd的读事件),则select会立即返回。 TCP为尚未接受的连接(也称为挂起连接)维护一个单独的队列。