PHP套接字(socket_read)

时间:2012-12-06 20:23:44

标签: php sockets

我处理个人项目,我在多客户端服务器上管理套接字时遇到问题。

因此,根据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()不会阻止我的脚本和扫描我的套接字,直到它找到要读的东西。

第二个问题是,由于我的程序没有停止,我的客户端没有收到任何东西,当我停止服务时,我的客户收到消息......

你有什么想法吗?

由于

2 个答案:

答案 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”而不是我只能在服务器停止时在我的客户端收到消息。