2017-10-12 184 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

感谢您的答案,从过去两天的工作中我得知服务器没有正确设置以接收来自外部设备的信息。防火墙阻止传入的连接。没有共享主机/可以托管服务提供商准备打开该端口。他们说,出于安全原因,他们不会打开出站连接的端口。最后,在打开入站和出站连接的端口后,相同的代码与专用服务器配合良好。

相关问题