За последние 24 часа нас посетили 22864 программиста и 1246 роботов. Сейчас ищут 795 программистов ...

Открытие сокета на сервере

Тема в разделе "PHP для новичков", создана пользователем MiklPolikov, 14 май 2022.

  1. MiklPolikov

    MiklPolikov Новичок

    С нами с:
    14 май 2022
    Сообщения:
    1
    Симпатии:
    0
    Открываю на сервере сокет.
    Подключаюсь к нему через PUTTY
    Всё что делает скрипт на сервере логирую в файл.
    Ожидаю получить чат: на сервер приходит то, что я набрал в PUTTY; в PUTTY выводится то, что отправил сервер.

    На самом деле вижу:

    1) При подключении сокет на сервере принимает строку "SSH-2.0-PuTTY_Release_0.76", т.е. подключение к сокету, в принципе, происходит.
    2) Пытаюсь что-то набирать в окне PUTTY, жать ENTER, больше ни чего не передаётся.
    3) Скрипт выполняет socket_write(), но в PYTTY ни чего не появляется.
    4) Скрипт блокируется на socket_read()
    5) Скрипт разблокируется и socket_read() возвращает пустую строку после закрытия окна PUTTY

    Кто может, объясните, что я не понимаю ?
    Заранее спасибо !

    PHP:
    1.  
    2. /////////записываем в файл ошибки/////
    3. set_error_handler('err_handler',E_ALL);
    4. function err_handler($errno, $errmsg, $filename, $linenum) {
    5.    date_default_timezone_set('Europe/Moscow');
    6.    $err  = "$errmsg = $filename = $linenum";
    7.    $text = date("H:i:s")."   ".$err."\r\n";
    8.    $file_name=date("Y_m_d")."_error".".txt";
    9.  
    10.    $fp = fopen($file_name, "a" );
    11.    fwrite($fp, $text);
    12.    fclose($fp);  
    13. }
    14.  
    15.  
    16. /////////записываем в файл результаты выполнения/////
    17. function log_to_file($text){
    18.    date_default_timezone_set('Europe/Moscow');
    19.    $text = date("H:i:s")."   ".$text."\r\n";
    20.    $file_name=date("Y_m_d")."_log".".txt";
    21.    $fp = fopen($file_name, "a" );
    22.    fwrite($fp, $text);
    23.    fclose($fp);  
    24. }
    25.  
    26. // Позволяет скрипту ожидать соединения бесконечно.
    27.  
    28. /////
    29. $address = '185.26.121.226';  //le-control.ru
    30. $port = 8443;
    31.  
    32.  
    33. ///////создаём сокет
    34. if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    35.     log_to_file("socket_create() ПРОВАЛ: ". socket_strerror(socket_last_error()));
    36. }
    37. else{
    38.     log_to_file("socket_create() УСЕХ: ". socket_strerror(socket_last_error()));
    39. }
    40.  
    41. if (socket_bind($sock, $address, $port) === false) {
    42.     log_to_file( "socket_bind() ПРОВАЛ: ". socket_strerror(socket_last_error($sock)) );
    43.     exit; //если такой порт уже открыт, значи скрипт уже запущен, второй раз запускать не нужно
    44. }
    45. else{
    46.     log_to_file( "socket_bind() УСПЕХ: ". socket_strerror(socket_last_error($sock)) );
    47. }
    48.  
    49. if (socket_listen($sock, 5) === false) {
    50.       log_to_file( "socket_listen() ПРОВАЛ: ". socket_strerror(socket_last_error($sock)) );
    51. }
    52. else{
    53.       log_to_file( "socket_listen() УСПЕХ: ". socket_strerror(socket_last_error($sock)) );
    54. }
    55.  
    56.  
    57. ////////////////////////////////////////////////
    58.  
    59. ////ждём подключение в бесконечном цикле
    60. do {
    61.     log_to_file("ПЕРЕД ВЫЗОВОМ socket_accept");
    62.     $msgsock = socket_accept($sock);
    63.     if ($msgsock=== false) {
    64.         log_to_file( "socket_accept() ПРОВАЛ ". socket_strerror(socket_last_error($sock)) );
    65.         break;
    66.     }
    67.     else
    68.     {
    69.         log_to_file( "socket_accept() УСПЕХ ". socket_strerror(socket_last_error($sock)) );
    70.         log_to_file( "////////////////////////////////////////////////");
    71.     }  
    72.    
    73.     //устанавливаем не блокирующий режим
    74.     socket_set_nonblock($msgsock);
    75.    
    76.     //устанавливаем таймаут чтения 10000uS
    77.     socket_set_option($msgsock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>0, "usec"=>10000));
    78.    
    79.     ////читаем и пишем в бесконечном цикле
    80.     do {
    81.         log_to_file( "ПЕРЕД ВЫЗОВОМ socket_read()" );
    82.         $buf = socket_read($msgsock, 2000, PHP_NORMAL_READ);
    83.         if (false === $buf) {
    84.             log_to_file( "socket_read(): ПРОВАЛ:". socket_strerror(socket_last_error($msgsock)) );
    85.             break;
    86.         }
    87.         else
    88.         {
    89.             log_to_file( "socket_read() УСПЕХ: buf = ".strlen($buf)." = ".$buf );
    90.         }
    91.        
    92.         usleep(10000);
    93.        
    94.         log_to_file( "ПЕРЕД ВЫЗОВОМ socket_write()" );
    95.         $msg = "SUCCESS!!!\r\n\r\n";
    96.         $result=socket_write($msgsock, $msg, strlen($msg));
    97.         if($result===false){
    98.            log_to_file( "socket_write() ПРОВАЛ: ". socket_strerror(socket_last_error($msgsock)) );
    99.            break;
    100.         }
    101.         else{
    102.             log_to_file( "socket_write() УСПЕХ: ". $result );
    103.         }      
    104.        
    105.        
    106.     } while (true);
    107.     socket_close($msgsock);
    108.     log_to_file( "ВЫШЛИ ИЗ ЦИКЛА ЧТЕНИЯ-ЗАПИСИ. ВЫПОЛНИЛИ socket_close(msgsock)" );
    109.    
    110. } while (true);
     

    Вложения:

    • Putty.jpg
      Putty.jpg
      Размер файла:
      77,9 КБ
      Просмотров:
      0
    • Лог.jpg
      Лог.jpg
      Размер файла:
      347,4 КБ
      Просмотров:
      0