簡體   English   中英

PHP fsockopen() 失敗未打開端口但 telnet 工作

[英]PHP fsockopen() fails does not open port but telnet works

在過去 2 天里,我正面臨一個奇怪的網絡問題,試圖解決這個問題。 我無法在 php 網頁上打開端口 25003。 代碼似乎不是問題,但是,如下所示。

 $host = 'xx.xx.xx.xx'; // statis public ip address assigned by my isp $ports = array(80, 25003); foreach ($ports as $port) { $connection = fsockopen($host, $port); if (is_resource($connection)) { echo '<h2>' . $host . ':' . $port . ' ' . '(' . getservbyport($port, 'tcp') . ') is open.</h2>' . "\\n"; fclose($connection); } else { echo '<h2>' . $host . ':' . $port . ' is not responding.</h2>' . "\\n"; } }

端口 80 顯示打開但不顯示端口 25003。

該站點也托管在具有靜態 IP 的 Bluehost 共享托管計划上。 與他們交叉驗證了端口 25003 在傳入和傳出連接上都打開的事實的 3 倍以上。 他們會不會撒謊,我不這么認為。

在客戶端 PC 設置上:

(1) Firewall is disabled for testing purpose.

(2) Port forwarding is done correctly in router. I assume so because
 I can easily telnet MY PUBLIC IP with a port 25003 within the same
 LAN and from phone using sim card's internet.

(3) I did a port check from https://ping.eu/port-chk/ and it shows open.

(4) Client PC has a serproxy installed for serial to IP & Port.
(5) When I do a port check from above link, serproxy shows following message which seems to be okay on its part.
      * server thread launched
      * server(1) - thread started
      * server(1) - EOF from sock
      * server(1) - Exiting

(6) Again, when I telnet from external lan, it shows above message in Client PC's Serproxy which means it is doing its work properly. And it shows correct data from serial port to cmd line while telneting. 

問題是當我 fsockopen 使用上面的代碼片段時,它說連接被拒絕。

下面是我的實際代碼,它應該嘗試從串行端口連接和讀取數據,但連接被拒絕。

 $fp = fsockopen("tcp://xx.xx.xx.xx", 25003, $errno, $errstr); if (!$fp) { echo "$errstr ($errno)<br />\\n"; } else { if (!feof($fp)) { $weight = trim(fgets($fp, 64)," "); } } echo $weight; fclose($fp);

我認為問題在於 bluehost 共享服務器或客戶端 Windows PC 或 SERPROXY 或本地網絡配置。 恐怕除了正確設置的 SERPROXY 中的波特率、com 端口等之外,可能還有任何重大的配置更改。

我現在完全不知道如何解決上述問題。 如果有人可以提供幫助,將不勝感激。

如果有人想檢查連接,我會共享公共 IP。

就像我提到的 - 以前當我嘗試連接所有嘗試失敗但下面的兩種方法現在都可以工作所以我認為問題已解決。 我可能會建議重新啟動網絡服務器和瀏覽器

<?php
    set_time_limit( 0 );
    error_reporting( E_ALL );

    $address = 'xxx.xxx.xxx.xxx';
    $port = 25003;


    /* Method #1 */
    $fp = fsockopen( "tcp://{$address}", 25003, $errno, $errstr );
    if( !$fp ) echo "$errstr ($errno)<br />\n";
    else {
        if( !feof( $fp ) ) {
            $weight = trim(fgets($fp, 64)," ");
        }
    }
    printf('<h1>Method #1</h1>Weight: %s<br /><br />',$weight);
    fclose($fp);




    /* Method #2 */
    function geterror(){
        $obj=new stdClass;
        $obj->code=socket_last_error();
        $obj->error=socket_strerror( $obj->code );
        return $obj;
    }
    function negotiate( $socket ) {
        socket_recv( $socket, $buffer, 1024, 0 );

        for( $chr = 0; $chr < strlen( $buffer ); $chr++ ) {
            if( $buffer[ $chr ] == chr( 255 ) ) {
                $send = ( isset( $send ) ? $send . $buffer[$chr] : $buffer[$chr] );

                $chr++;
                if( in_array($buffer[$chr], array(chr(251), chr(252))) ) $send .= chr(254);
                if( in_array($buffer[$chr], array(chr(253), chr(254))) ) $send .= chr(252);

                $chr++;
                $send .= $buffer[$chr];
            } else {
                break;
            }
        }
        if( isset($send)) socket_send($socket, $send, strlen($send), 0);
        if( $chr - 1 < strlen($buffer)) return substr($buffer, $chr);
    }



    $socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );


    try{

        if( $socket && is_resource( $socket ) ){
            if( !socket_connect( $socket, $address, $port ) ){
                $err=geterror();
                throw new Exception( sprintf( 'socket_connect: %s', $err->error ), $err->code );
            } else {

                while( true ){

                    $e=null;
                    $w=null;
                    $r = array( $socket );
                    $c = socket_select( $r, $w, $e, 5 );

                    foreach( $r as $read_socket ) {
                        if( $r = negotiate( $read_socket ) ) {
                            exit( sprintf( '<h1>Method #2</h1>Reading: %s', print_r( $r, true ) ) );
                        }
                    }
                }
            }

        } else {
            $err=geterror();
            throw new Exception( sprintf( 'Failed to create socket: %s',$err->error ), $err->code );
        }

    }catch( Exception $e ){
        printf( "
        <pre>
            <h1>Error: %d</h1>\nMessage: %s\nTrace: %s\nLine: %d
        </pre>",$e->getCode(),$e->getMessage(),$e->getTraceAsString(),$e->getLine() );
    }
    socket_close( $socket );
?>

所示兩種方法的輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM