За последние 24 часа нас посетили 17513 программистов и 1741 робот. Сейчас ищут 1087 программистов ...

Проверка порта (TCP). Передача и получение данных(строк)

Тема в разделе "Прочие вопросы по PHP", создана пользователем poryt, 26 авг 2010.

  1. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Добрый день.
    Как проверить порт примерно нашел.
    PHP:
    1. $fp = @fsockopen($host,$some_port, stream_set_timeout($fp, 15));
    2. if ($fp)  
    3.  {  
    4. echo 'работает!';   fclose($fp);  
    5.  }
    6.  else
    7.  { echo 'ниработает!';    
    8. }
    А вот как мне послать тому, что может быть на этому порту какую-то строку и если будет ответ, то получить его, не пойму. Подскажите, пожалуйста?
    И еще,как-то можно время отклика получить, без пинга? $fp возвращает его? Я посмотрел, не нашел ничего похожего.
    Спасбио заранее.
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
  3. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Это же функции для записи/чтения в/из файл(а). А мне нужно послать эту строку "программе" висящей на том порту, и получить ответ.
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    не только. в сокет пишут и из него читают
     
  5. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
  6. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    PHP:
    1. <?php
    2. $fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
    3. if (!$fp) {
    4.     echo "ERROR: $errno - $errstr<br />\n";
    5. } else {
    6.     fwrite($fp, "\n");
    7.     echo fread($fp, 26);
    8.     fclose($fp);
    9. }
    10. ?>
    Вот это, верно? Уберём udp, сменим порт и будет то, что мне нужно, да?
    То есть я могу тут заменить, допустим
    PHP:
    1. fwrite($fp, "\n");
    на
    PHP:
    1. fwrite($fp, "my_cool_text");
    Таким образом я запишу эту строку в соккет, так?
     
  7. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    poryt
    а попробовать никак?
     
  8. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    PHP:
    1.  <?php
    2. $fp = fsockopen("127.0.0.1", 23412, $errno, $errstr);
    3.  if (!$fp) {
    4.       echo "ERROR: $errno - $errstr<br />\n";
    5.   } else {
    6.      fwrite($fp, "qwer");
    7.       echo fread($fp, 26);
    8.      fclose($fp);
    9.  }
    10. ?>
    вот так попробовал - страница не грузится. У меня же ничего не запущено, что запустить - не знаю.
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    ну так на кой ты тычешь в порт 23412 строку "qwer" без понимания того что должно вернуться?
    какой запрос - такой и ответ будет в сокет. Если ты наугад чтото оправляешь то и ничего не вернется.
     
  10. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Ну да.
    Попробовал на 80 порт отправить строку. Вроде ок прошло. Считать не может пока что. Если на 80 так посылать, норм будет по идее же? или вебсервера там данные будут перемешиваться?
    Код такой.
    PHP:
    1.  
    2.  
    3. $fp = fsockopen("127.0.0.1", 80, $errno, $errstr);
    4.  if (!$fp) {
    5.       echo "ERROR: $errno - $errstr<br />\n";
    6.   } else {
    7.      fwrite($fp, "my_text");
    8.       $output=fread($fp, 4096);
    9.      fclose($fp);
    10.  }
    Я вероятно саму логику не понимаю, можете просто еще советом помочь?
    Вот такой код будет работать, если на сервере на этому порту всё будет ок работать и возвращать то, что нужно?
    То есть, размер возвращаемой строки же не 4096 может быть, нужно скорее всего циклом в переменную передать?
     
  11. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Во, нашел в манах такой код.
    PHP:
    1. <?php
    2. $fp = fsockopen("example.host.com", 80);
    3. if (!$fp) {
    4.     echo "$errstr ($errno)<br />\n";
    5. } else {
    6.     fwrite($fp, "Data sent by socket");
    7.     $content = "";
    8.     while (!feof($fp)) {
    9.         $content .= fread($fp, 1024);
    10.         $stream_meta_data = stream_get_meta_data($fp); //Added line
    11.          if($stream_meta_data['unread_bytes'] <= 0) break; //Added line
    12.     }
    13.     fclose($fp);
    14.     echo $content;
    15. }
    16. ?>
    Вот тут же посылается и принимается всё нормально, так?
    stream_get_meta_data используется из-за того, что цикл не всегда прекращается по какой-то причине.
     
  12. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    ставить таймаут нужно

    чтобы получить какойто ответ, на том "другом" конце сокета программа должна быть расчитана на прием какогото запроса. Просто так ты любой запрос конечно можешь отправить, но в ответ придет только на рассчитанные на то команды.
     
  13. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Да, конечно. Это до меня дошло, ступил. Но если программа на том конце расчитана на прием/отправку данных, то код который выше логически верен? Всё запишется и считается?
     
  14. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    unread_bytes - не рекомендуется использовать в оф. мануале, хотя оно может работать.
    с виду верен. надо уже по случаю смотреть что приходит.
     
  15. poryt

    poryt Активный пользователь

    С нами с:
    13 янв 2010
    Сообщения:
    17
    Симпатии:
    0
    Понял, спасибо. Буду тестировать.