На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Perl сокеты и ошибки
      Если кто-то знает, подскажите.
      Прога на перле с use socket. Без LWP и прочих наворотов.
      Что-то типа
      .
      connect(MYSOCK, $sin) || die "Failed to connect() to server: $!\n";
      send (MYSOCK, "GET / HTTP/1.0\n\n", 0) || die "Can't to send packet: $!\n";
      open(OUT, ">download.txt");
      while (<MYSOCK>) {
       print OUT <MYSOCK>;
      }
      .
      Так вот скачивает все (мне нужен заголовок ответа) кроме кода ответа сервера, ну там 404 - не найдено, 200 ОК и т.д.
      Коннекчусь туда же телнетом, даю GET -
      .
      HTTP/1.1 200 OK (*)
      Date: Wed, 28 Aug 2002 17:15:55 GMT
      Server: Apache/1.3.26 (Unix)
      Last-Modified: Tue, 28 Aug 2002 13:15:55 GMT
      .
      Перл отдает все кроме первой строки (*), а мне она как раз и нужна.
      Как победить?
        #!/usr/local/bin/perl

        use IO::Socket; use strict 'vars';

        my ($addr, $sin, $data, $proto, @data);
        $proto = getprotobyname('tcp');

        die unless defined $ARGV[0];

        $addr = $ARGV[0];

        socket(SITE, PF_INET, SOCK_STREAM, $proto) or die $!;

        $sin = sockaddr_in(80, inet_aton($addr));

        connect(SITE, $sin) or die "Connection to $addr failed!\n";

        send(SITE, "GET / HTTP/1.1\n\n", 0, $sin) or die $!;
        recv SITE, $data, 50, 0;

        @data = split(/\n/, $data); print $data[0];

        shutdown(SITE, 2);

        # Отака от *****, малятки! :-)
          Эээ?
          Я же написал, программа на использует только
          use Socket
          а если IO::Socket, то тогда воде надо через
          $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
                                          PeerPort => 'http(80)',
                                          Proto    => 'tcp');

          Если я правильно в справке посмотрел.
          Но суть не в этом, а почему ты при recv закладываешь длину = 50?
          Кстати со своим примером я почти разобрался.
            Тогда решение в студию :)
              Дело в том, что тебе ведь нужно было лишь получить строчку вида HTTP/1.1 200 OK, поэтому достаточно прочитать лишь 50.

              З.Ы. Да и вообще-то зденсь не юзаются функции специфичные для IO::Socket, поэтому можешь спокойно написать use Socket; мне просто так захотелось! :)
              Сообщение отредактировано: bones -
                To vot -

                В программе во-первых ошибка /_не я нашел_/, в цикле while надо ставить:

                while (<MYSOCK>) {
                 print OUT $_;
                }

                Иначе строки выдаются через одну.
                Но это еще не все ошибки, после того как исправил стали выдаваться лишние пустые строки.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0257 ]   [ 15 queries used ]   [ Generated: 27.04.24, 05:46 GMT ]