我处理个人项目,我在多客户端服务器上管理套接字时遇到问题。
因此,根据php.net,可以将socket_read()的参数设置为socket_create创建的套接字或socket_accept接受的套接字......
如果我明白,socket_create创建的套接字是一个“本地”套接字,socket_accept发送的套接字是套接字客户端,是吗?
在这种情况下,我想把我的服务器套接字放在socket_read的参数中,等待一个客户端在这个套接字上写几个。
更清楚的是,我接受4个客户端,并等待其中一个客户端写入此套接字,但我不能将参数放入特定的客户端套接字,因为我不知道它们中哪个会写...
当我把套接字创建时:socket_create,php给我一个错误
我的母语不是英语,你可以看到,但没有人能回答我......
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "socket_create() a échoué : raison : " . socket_strerror(socket_last_error()) . "\n";
}
if (socket_bind($sock, $this->address, $this->port) === false) {
echo "socket_bind() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
}
if (socket_listen($sock, 5) === false) {
echo "socket_listen() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
}
for($i=0;$i<$this->maxClient;$i++){
if(($client = socket_accept($sock)) === false){
echo "socket_accept() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
break;
}else echo "<br/>Client $client[$i] has connected\n";
$this->joueurs[$i] = new Joueur($client,$i);
}
while($start){
$messageClient = socket_read($sock , 1024);
......
}
所以,我有两个问题,第一个是,我需要socket_read()不会阻止我的脚本和扫描我的套接字,直到它找到要读的东西。
第二个问题是,由于我的程序没有停止,我的客户端没有收到任何东西,当我停止服务时,我的客户收到消息......
你有什么想法吗?
由于
答案 0 :(得分:0)
熟悉socket_select
- 它允许等待多个套接字变得可读或/和可写,或者有错误。当有新连接待处理/准备好accept()
- 编辑
答案 1 :(得分:0)
我发现了我的问题: 解锁socket_read()
socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));
socket_set_nonblock($socket);
对于清除缓冲区我使用“/ n”而不是我只能在服务器停止时在我的客户端收到消息。