PHP fsockopen () не работает, не открывает порт, но Telnet работает - PullRequest
0 голосов
/ 29 сентября 2018

У меня странная проблема с сетью, которую я пытался решить последние 2 дня.Я не могу открыть порт 25003 на веб-странице php.Код, похоже, не является проблемой, однако, как указано ниже.

$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.

Сайт размещен в плане общего хостинга Bluehost со статическим IP-адресом.Перекрестный с ними более чем в 3 раза подтвержден тот факт, что порт 25003 открыт как на входящем, так и на исходящем соединении.Будут ли они лгать, я так не думаю.

На настройках клиентского ПК:

(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, либо в SERPROXY, либо в конфигурации локальной сети.Я боюсь, что в SERPROXY возможно какое-либо серьезное изменение конфигурации, кроме скорости в бодах, com-порта и т. Д., Которые установлены правильно.

Теперь я совершенно не понимаю, как решить указанную проблему.Если кто-то может помочь, будет принята с благодарностью.

Я бы предоставил общедоступный IP-адрес, если кто-то захочет проверить подключение.

1 Ответ

0 голосов
/ 29 сентября 2018

Как я уже упоминал - ранее, когда я пытался соединиться, все попытки потерпели неудачу, но теперь оба метода работают, поэтому я предполагаю, что проблема исправлена.Возможно, я бы предложил перезапустить веб-сервер и браузер (ы)

<code><?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
", $ e-> getCode (), $ e-> getMessage (), $ e-> getTraceAsString (), $ e-> getLine());} socket_close ($ socket);?>

output from the two methods shown

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...