1

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

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

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

你有什么想法吗?

谢谢

4

2 回答 2

0

我发现了我的问题:解锁 socket_read()

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));
                socket_set_nonblock($socket);

而对于清除缓冲区,我使用“/n”,而只有当服务器停止时,我才能在客户端接收消息。

于 2012-12-08T23:17:17.227 回答
0

熟悉socket_select- 它允许等待多个套接字变得可读或/和可写,或者有错误。当有新的连接挂起/准备就绪时,侦听套接字变得可读accept()

于 2012-12-06T20:42:37.227 回答