Php 警告:套接字连接()[函数.套接字连接]:无法连接[110]:连接超时

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

我有一个使用套接字的php脚本,当我在localhost(XAMPP)上测试它时,我的代码运行良好。 但是在我把同样的代码上传到我的网络主机后,它就不能正常工作了。详细地说,它会加载几分钟,最后给出这些错误消息

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/....
我认为这可能是因为服务器阻塞了套接字连接。我的问题是:

  • 我可以执行一些代码来检查服务器是否阻止它吗?(例如phpinfo())
  • 我应该关注哪些服务器配置,以便尝试使其连接?(我可以访问.htaccess文件,但不能访问php.ini)
  • 套接字连接是否需要SSL
  • 如果由于服务器设置的原因,我最终无法修复此问题,我需要另一个web主机。我应该注意“计划列表”上的哪些功能/关键字
  • 我知道有很多问题,但我希望有人能帮助我。
    如果有人能给我一些建议,非常感谢。

    这太奇怪了。。。据我所知,实际上没有特定的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