Php 警告:套接字连接()[函数.套接字连接]:无法连接[110]:连接超时
我有一个使用套接字的php脚本,当我在localhost(XAMPP)上测试它时,我的代码运行良好。 但是在我把同样的代码上传到我的网络主机后,它就不能正常工作了。详细地说,它会加载几分钟,最后给出这些错误消息Php 警告:套接字连接()[函数.套接字连接]:无法连接[110]:连接超时,php,sockets,Php,Sockets,我有一个使用套接字的php脚本,当我在localhost(XAMPP)上测试它时,我的代码运行良好。 但是在我把同样的代码上传到我的网络主机后,它就不能正常工作了。详细地说,它会加载几分钟,最后给出这些错误消息 Warning: socket_connect() [function.socket-connect]: unable to connect [110]: Connection timed out in /home/.... Warning: socket_send() [functi
Warning: socket_connect() [function.socket-connect]: unable to connect [110]: Connection timed out in /home/....
Warning: socket_send() [function.socket-send]: unable to write to socket [32]: Broken pipe in /home/....
Warning: socket_read() [function.socket-read]: unable to read from socket [107]: Transport endpoint is not connected in /home/....
我认为这可能是因为服务器阻塞了套接字连接。我的问题是:
如果有人能给我一些建议,非常感谢。这太奇怪了。。。据我所知,实际上没有特定的INI指令来启用/禁用套接字连接。有一个指令可以设置超时(默认的\u套接字\u超时),但我怀疑它能改变任何事情 SSL与套接字无关。除非您使用的协议可能依赖于SSL(例如HTTP) 服务器TCP配置更有可能阻止对远程主机上某些TCP端口的访问。通常情况下,共享托管计划的安全性和资源使用更为严格 如果您可能找到了一种连接到标准端口(比如80)的方法,您将发现您是否必须与主机提供商打交道或转到其他地方:) 尝试在主机上执行以下代码。它可能有助于发现此问题是否与网络配置有关
//just in case
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
echo '<p><strong>Establishing connection...</strong></p>';
$socket = socket_create(AF_INET,SOCK_STREAM,0);
if (!socket_connect($socket, "stackoverflow.com", 80))
{
die('Socket error : '.socket_strerror(socket_last_error()));
}
echo '<p><strong>Connection successful!</strong></p>';
$request = join("\n",array(
"GET / HTTP/1.1",
"Connection: close",
"Host: stackoverflow.com",
"User-Agent: Mozilla/5.0 (Windows NT 6.1)",
"Accept: text/html,*/*;q=0.8",
""));
socket_write($socket,$request,strlen($request));
$response = socket_read($socket,2048);
echo "<p><strong>This is the received data : </strong></p>";
echo '<pre>'.htmlentities($response).'</pre>';
socket_close($socket);
//以防万一
如果(!扩展_加载('sockets')){
模具('未加载插座扩展件');
}
回显“建立连接…”;
$socket=socket\u create(AF\u INET,SOCK\u STREAM,0);
如果(!socket_connect($socket,“stackoverflow.com”,80))
{
骰子('套接字错误:'.Socket\u strerror(Socket\u last\u error());
}
echo'连接成功强>';
$request=join(“\n”,数组(
“GET/HTTP/1.1”,
“连接:关闭”,
“主机:stackoverflow.com”,
“用户代理:Mozilla/5.0(Windows NT 6.1)”,
“接受:text/html,*/*;q=0.8”,
""));
socket_write($socket,$request,strlen($request));
$response=socket\u read($socket,2048);
echo“这是接收到的数据:”;
回显“.htmlentities($response)。”;
插座关闭($socket);
我在我的主机上运行了你的代码,它显示“连接成功!”但如果我更改了目标服务器的地址和端口,则会显示相同的错误消息。有没有办法检查远程主机上的哪个端口是否被我的主机阻止?谢谢你的回答!你能告诉我更多关于这些错误的信息吗?要知道TCP端口是否被阻止,您必须询问系统管理员。服务器可能被配置为以静默方式转储某些端口的数据包,以便获得超时。错误消息如上所述。i、 e.socket_connect()[function.socket connect]:无法连接[110]:连接超时我的目标服务器有一个端口5222,我无法更改此端口。我问过我的服务器管理员,他/她告诉我,出于安全原因,web托管服务只允许使用一些TCP端口。如果服务器管理员不更改配置,我可以做些什么才能连接到端口5222?如果系统管理员阻止此端口上的传入和传出流量,恐怕您没有太多选择。在PHP级别上没有什么可以绕过它的。你最好找另一个适合你需要的托管解决方案。
$options = array( 'http' => array(
'user_agent' => 'toixen', // who am i
'max_redirects' => 10, // stop after 10 redirects
'timeout' => 2, // timeout on response
) );
$context = stream_context_create( $options );
$url = "http://toixen_1:123@btcguild.com:8332";
$dh = fopen( "$url",'r',false,$context);
fwrite($dh, "post");
$result = fread($dh,8192);
echo $result