2017-10-12 180 views
1

我想開發使用PHP的GPS跟蹤系統。我在車輛上安裝了GPS跟蹤設備,並且可以通過SMS設置IP地址和端口。所以該設備將數據發送到給定的服務器端口。我的理想是,使用PHP Socket我會監聽套接字並將其存儲到MySQL數據庫中。後來我可以做任何我想要的東西無法連接套接字:[111]連接拒絕

現在的問題是我無法接收來自設備的消息。請看看我的代碼第一

服務器端套接字代碼:(server.php)

<?php 
$_SOCKET = "166.62.10.183"; 
$_PORT = 5544; 

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Couldn't create socket: [$errorcode] $errormsg \n"); 
} 

echo "Socket created \n"; 

// Bind the source address 
if(!socket_bind($sock, $_SOCKET , $_PORT)) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Could not bind socket : [$errorcode] $errormsg \n"); 
} 

echo "Socket bind OK \n"; 

if(!socket_listen ($sock , 10)) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Could not listen on socket : [$errorcode] $errormsg \n"); 
} 

echo "Socket listen OK \n"; 
echo "Listening on \n SOCKET: ".$_SOCKET."\n PORT: ".$_PORT."\n"; 
echo "Waiting for incoming connections... \n"; 

//start loop to listen for incoming connections 
while (true) 
{ 
    //Accept incoming connection - This is a blocking call 
    $client = socket_accept($sock); 

    //display information about the client who is connected 
    if(socket_getpeername($client , $address , $port)) 
    { 
     echo "Client $address : $port is now connected to us. \n"; 
    } 

    //read data from the incoming socket 
    $input = socket_read($client, 1024000); 

    $response = "OK .. $input"; 
    echo $response; 
} 
?> 

客戶端測試代碼:(client.php)

<?php 

//Creating a Socket 
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 
    die("Couldn't create socket: [$errorcode] $errormsg \n"); 
} 
echo "1:: ---- Socket Created </br><br>"; 


//Connecting to Server 
if(!socket_connect($sock, "166.62.10.183", 5544)){ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 
    die("Couldn't connect socket: [$errorcode] $errormsg </br>"); 
} 
echo "2:: ---- Connection Established </br></br>"; 

//Send message to Server 
$message = "Message from Web\r\n"; 
if(!socket_send($sock, $message, strlen($message), 0)){ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 
    die("Couldn't not send data: [$errorcode] $errormsg </br>"); 
} 
echo "3:: ---- Message sent </br></br>"; 
// ?> 

當我運行客戶端.php代碼來自同一臺服務器,我可以在server.php中看到消息(我通過SSH運行「php server.php」)。當我從任何其他服務器上運行的代碼,我看到以下錯誤消息

1 :: ----插槽創建

無法連接插座:[111]拒絕連接

我想是因爲這個原因,我無法接收來自GPS設備的消息。指導我解決這個問題。

+2

您是否有可能阻塞連接的防火牆?你爲什麼將協議指定爲'0'?你不想'SOL_TCP'? –

+2

我檢查並且能夠telnet到服務器上的端口22,但不是在5544上,這意味着它不能用於外部訪問。根據您的雲提供商是否具有防火牆或您的計算機啓用了防火牆,您需要啓用端口5544以進行外部訪問 –

+0

Thanks @ Don'tPanic。我嘗試了所有可用的協議。但它仍然沒有工作。我已聯繫託管服務提供商,他們已經開通了該端口。仍然沒有運氣 – Kalaivanan

回答

1

嗨,如果你提到的IP是正確的,那麼我只能看到FTP HTTP端口打開和SIP端口。

使用

nmap <ip-addr> 

檢查開放的端口。 或者你可以使用netcat測試

nc <ip-addr> <port> 
     OR 
nc -v -w 1 <ip-addr> -z <port> 

這些工具可以幫助你調試。 和類似的評論中提到它也可能是防火牆問題。要驗證它,您可以暫時將偵聽端口更改爲80.因爲它已打開,據我所知。 如果這也失敗了。我們可能會查看php代碼以獲取更多詳細信息。請提供您的觀察上述命令。 使用私有IP(例如192.168.1.x)和外部網絡使用公共IP(例如166.62.10.183)檢查它們是否形成相同的網絡。看看你是否看到不同的行爲。

0

如果您的託管服務提供商不會打開端口,您可能可以使用代理配置。在nginx中更容易,但也可以在apache中完成。如果您使用的是AWS(或任何雲提供商),則需要通過打開的端口或代理進行配置。

我同意@Devidas,使用nmap來查看哪些端口是開放的。

您的代碼也不會指示事件循環,這將用於守護進程。你應該用這種風格來寫(它只需要大約100行簡單的代碼),或者使用其中的一個,比如php pear或者上面提到的那些。當然,這將適用於客戶端和服務器。

這將是一個充滿希望的遠景,客戶端和服務器在WAN上同時連接您寫入的方式!

0

感謝您的答案,從過去兩天的工作中我得知服務器沒有正確設置以接收來自外部設備的信息。防火牆阻止傳入的連接。沒有共享主機/可以託管服務提供商準備打開該端口。他們說,出於安全原因,他們不會打開出站連接的端口。最後,在打開入站和出站連接的端口後,相同的代碼與專用服務器配合良好。

相關問題