2016-03-08 42 views
0

我想學習在PHP中的Socket編程。我掌握了一個教程。我遵循教程中的精確代碼,但是我的代碼返回PHP的socket_listen()不工作

無法偵聽套接字[22]:無效的參數錯誤。

我認爲這是更多的服務器錯誤,而不是代碼本身的錯誤。我在Ubuntu中運行XAMPP Server。

#!/opt/lampp/bin/php 
<?php 

// set some variables 
$host = "127.0.0.1"; 
$port = 80; 

// don’t timeout! 
set_time_limit(0); 

// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('Could not create socketn'); 

// bind socket to port socket_connect($socket, '/var/run/mysqld/mysqld.sock') 
$result = socket_connect($socket, $host, $port) or die('Could not bind to socketn'); 

// start listening for connections 
$result = socket_listen($socket, 3) or die('Could not set up socket listenern'); 

// accept incoming connections 
// spawn another socket to handle communication 
$spawn = socket_accept($socket) or die('Could not accept incoming connectionn'); 

// read client input 
//$input = socket_read($spawn, 1024) or die(「Could not read inputn」); 

// clean up input string 
$input = "red";//trim($input); 

// reverse client input and send back 
$output = strrev($input) . 'n'; 
socket_write($spawn, $output, strlen ($output)) or die('Could not write output n'); 
echo ($output); 

// close sockets 
socket_close($spawn); 
socket_close($socket); 


?> 

回答

0

既然你要聽端口,而不是做一個傳出的連接,您應該socket_connect改爲socket_bind(其中您的評論已經暗示)

$result = socket_bind($socket, $host, $port) or die('Could not bind to socketn') 

此外,你應該知道如果偵聽1024以下的端口,則需要以root用戶身份運行腳本(並非真正推薦用於試驗),因此您可能希望更改爲1024以上的端口以便能夠以普通用戶身份運行。

+0

腳本運行時沒有任何錯誤。你期望輸出 回聲($輸出); 要打印?該腳本返回給我沒有輸出,就像在無限循環中一樣。 – user2267386

+0

@ user2267386該腳本正在等待某件東西連接到您要求它聽的端口。例如,如果你使用'telnet localhost 8080'(假設你已經連接到8080端口),你應該在telnet和輸出到控制檯中看到輸出「dern」(紅色顛倒+「n」)。然後腳本將退出。 –