1

我正在使用以下 php 代码通过 php 套接字连接连接并向远程服务器发送请求。

<?php 
$host    = "X.X.X.X";
$port    = 1234;
$message = "<request>test</request>";
echo "Message To server :".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
stream_set_timeout($socket, 10);
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
//echo "Reply From Server  :".$result;
$info = stream_get_meta_data($socket);
if (isset($info['timed_out']) && $info['timed_out'])
{
    echo 'Connection timed out!';
}
else
{
    var_dump($result);
}
// close socket
socket_close($socket);
?>

正如确认的那样,远程机器正在接收我们的请求并在同一会话中向我们发送适当的响应。但不幸的是,执行脚本时我收到以下响应 -

504网关超时。服务器没有及时响应。

当从 Putty(执行代码的同一服务器)尝试时,我几乎立即(不到一秒)得到响应。

没有运行会阻止响应的防火墙。如 telnet 请求和响应中所见,所有 VPN 流量都通过隧道而没有任何阻塞。

现在我无法弄清楚没有通过这个 php 脚本得到响应的确切原因。我浏览了许多教程和示例代码,但没有找到运气。:(

请各位会员帮忙。

4

3 回答 3

1

我使用 php socket 来模拟 telnet 会话而不设置超时参数。试试下面的,让我知道进展如何

<?php

// You can use socket_strerror(socket_last_error()) to get the error details
$socket = socket_create(AF_INET,SOCK_STREAM,0) or die ('Could not create socket') ;

$result = socket_connect($socket,$host,$port) or die ('Could not connect to host');

// The server expects the enter key to pressed to execute the command which i simulate by
// appending a \n to the message sent to the server

socket_send($socket,$message,strlen($message),0) or die('Could not execute command');

$result = socket_read($socket,2048) or die('Could not read from socket');

var_dump($result);
于 2014-03-02T23:39:30.030 回答
0

这可能已经过时,但PHP 手册上的注释说:

如果有人感到困惑,stream_set_timeout 不适用于使用 socket_create 或 socket_accept 创建的套接字。请改用 socket_set_option。

代替:

<?php
stream_set_timeout($socket,$sec,$usec);
?>

利用:

<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
于 2014-02-28T19:31:59.017 回答
-1

尝试将 socket_read 中的读取模式设置为 PHP_NORMAL_READ

于 2014-04-20T07:22:17.057 回答