3

我有 php cli socket 服务器,代码如下;客户端连接并发送请求

<?php
// PHP SOCKET SERVER
error_reporting(E_ERROR);
// Configuration variables
$host = "127.0.0.1";
$port = 5600;
$max = 500;
$client = array();

// No timeouts, flush content immediatly
set_time_limit(0);
ob_implicit_flush();

// Server functions
function rLog($msg){
             $msg = "[".date('Y-m-d H:i:s')."] ".$msg;
             echo($msg."\n");

}
// Create socket
$sock = socket_create(AF_INET,SOCK_STREAM,0) or die("[".date('Y-m-d H:i:s')."] Could not create socket\n");
// Bind to socket
socket_bind($sock,$host,$port) or die("[".date('Y-m-d H:i:s')."] Could not bind to socket\n");
// Start listening
socket_listen($sock) or die("[".date('Y-m-d H:i:s')."] Could not set up socket listener\n");

rLog("Server started at ".$host.":".$port);
// Server loop
while(true){
             socket_set_block($sock);
             // Setup clients listen socket for reading
             $read[0] = $sock;
             for($i = 0;$i<$max;$i++){
                          if($client[$i]['sock'] != null)
                                       $read[$i+1] = $client[$i]['sock'];
             }
             // Set up a blocking call to socket_select()
             $ready = socket_select($read,$write = NULL, $except = NULL, $tv_sec = NULL);
             // If a new connection is being made add it to the clients array
             if(in_array($sock,$read)){
                          for($i = 0;$i<$max;$i++){
                                       if($client[$i]['sock']==null){
                                                    if(($client[$i]['sock'] = socket_accept($sock))<0){
                                                                 rLog("socket_accept() failed: ".socket_strerror($client[$i]['sock']));
                                                    }else{
                                                                 rLog("Client #".$i." connected");
                                                    }
                                                    break;
                                       }elseif($i == $max - 1){
                                                    rLog("Too many clients");
                                       }
                          }
                          if(--$ready <= 0)
                          continue;
             }
             for($i=0;$i<$max;$i++){
                          if(in_array($client[$i]['sock'],$read)){
                                       $input = socket_read($client[$i]['sock'],1024);

                                        if($input){

                                                    rLog("Client ".$i." Call:".$input.")");

                                                    ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
                                                    ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
                                                    ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
                                                    ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
                                                    ## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##

                                        }
                          }
             }
}
// Close the master sockets
socket_close($sock);
?>

问题:
-如何检测连接到我的 php cli 套接字服务器的客户端的 IP 地址?

4

1 回答 1

4

在您成功呼叫的线路之后,立即socket_accept()呼叫socket_getpeername()

if (($client[$i]['sock'] = socket_accept($sock)) < 0) {
    rLog("socket_accept() failed: ".socket_strerror($client[$i]['sock']));
} else {
    rLog("Client #".$i." connected");
    socket_getpeername($client[$i]['sock'], $address, $port);
}

$address现在包含远程主机的 IP 地址,并$port包含远程端口。随心所欲地处理这些信息。

于 2012-07-18T13:39:39.433 回答