1
我有以下代碼的php cli套接字服務器;客戶端連接,併發送請求指定連接到PHP CLI套接字服務器的客戶端的遠程IP地址
<?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地址?
請注意,您的代碼不能處理併發連接。如果你想要的話,你必須使用支持線程的東西。即Node.js等 – Ron 2012-07-18 13:33:11
@Ron它*可以在PHP中完成,但是你不應該這樣做,因爲它是一個完整的PITA,並且在單進程,單線程環境中不能很好地工作。但是也需要注意的是,Node.js確實不支持線程。因爲它是基於Javascript的,所有事情都是在單一進程中用一個線程執行的(嘿,我聽到你說,不是PHP那樣的?等待它...),它只是*顯示*因爲Javascript調度程序的工作方式。但是,您可以通過創建WebWorkers來產生新的進程 - 但這些仍然是單線程的。 – DaveRandom 2012-07-18 13:43:28
@Ron值得進一步閱讀[這裏](http://ejohn.org/blog/how-javascript-timers-work/)。我感覺這張圖總結得非常好。但是,我不會期望[John Resig](http://stackoverflow.com/users/6524/john-resig)有任何其他內容。 – DaveRandom 2012-07-18 13:45:44