2017-10-12 47 views
1

PHPを使用してGPS追跡システムを開発しようとしています。車にGPSトラッキングデバイスがインストールされており、SMS経由でIPアドレスとポートを設定することができます。そのデバイスは、指定されたサーバーポートにデータを送信します。私の理想は、PHPソケットを使用してソケットを聞いてMySQLデータベースに格納します。後で私が欲しいものは何でもできますソケットに接続できませんでした:[111]接続が拒否されました

今、問題はデバイスからメッセージを受け取ることができません。私は、クライアントを実行している場合には(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>"; 
// ?> 

:(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; 
} 
?> 

クライアント側のテスト・コード:最初

私のコードに

サーバ側ソケットコードを見てください。 .phpコードを同じサーバから取得すると、server.phpのメッセージを見ることができます(SSH "php server.php"を実行しています)。私は他のサーバからコードを実行しているとき、私は、エラーメッセージ、次の見てい

1 :: ----ソケット作成さ

ソケットは接続できませんでした:[111]接続が

を拒否しました

このため、GPSデバイスからのメッセージを受信できないと思います。この問題を解決するために私をガイドしてください。

+2

接続をブロックしている可能性のあるファイアウォールはありますか?プロトコルを「0」と指定するのはなぜですか?あなたは 'SOL_TCP'を望んでいませんか? –

+2

私はチェックして、サーバーのポート22にtelnetで接続できましたが、5544には接続できませんでした。つまり、外部アクセスが有効になっていません。あなたのクラウドプロバイダーがファイアウォールを持っているかマシンがファイアウォールを有効にしているかによって、外部アクセスのためにポート5544を有効にする必要があります –

+0

Thanks @ Don'tPanic。私はすべての利用可能なプロトコルを試しました。しかし、それでも動作しません。私はホスティングプロバイダに連絡し、彼らはポートを開いている。まだ運がありません – Kalaivanan

答えて

1

こんにちは、あなたが言及している場合は、私はftpのhttpポートだけ開いているとポートを見ることができます正しいです。

開いているポートを確認するために

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

ファイアウォールの問題は、@Don't Panic@Tarun Lalwaniというように聞こえますが、サーバーがそのポートを開いて特定のポートに接続して、インバウンド接続を受け入れるようにしたい場合は、必ず確認してください。

また、自分のソケットサーバーをゼロから作成しようとしているのはなぜですか? plenty of PHP socket libraries out there to make your life easierがあります。ReactPHPRatchetをご覧ください。

0

ホスティングプロバイダがポートを開かない場合は、プロキシ設定を使用することができます。 nginxでは簡単ですが、Apacheでも実行できます。 AWS(またはクラウドプロバイダ)を使用している場合は、開いているポートまたはプロキシを開いているポートまたはプロキシを設定する必要があります。

私は@Devidasに同意し、nmapを使ってどのポートが開いているかを確認します。

あなたのコードは、デーモン化するために必要となるイベントループも示していません。あなたはこのスタイルで書くべきです(単純なものでは約100行のコードしか必要としません)。例えば、php pearや上記のような多くのものを使用してください。これはもちろん、クライアントとサーバーの両方に適用されます。

クライアントとサーバーが同じ方法でWAN経由で同じ時刻に接続することを期待しています。

0

すべてのお返事ありがとうございます。過去2日間、私はサーバーが外部デバイスから情報を受信するために正しくセットアップされていないことを知りました。ファイアウォールが着信接続をブロックしています。共有ホスティング/ホスティングサービスプロバイダは、ポートを開く準備ができていません。セキュリティ上の理由から、彼らはアウトバウンド接続のためにポートを開けません。最後に、インバウンドおよびアウトバウンド接続用のポートを開いた後の専用サーバーと同じコードがうまく機能する

関連する問題