Работа с сокетами,мать их))

Discussion in 'PHP' started by Велемир, 11 Jul 2008.

  1. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Вот самый обычный сокед:

    #!usr/bin/perl

    use strict; use Socket;
    use constant DEFAULT_ADDR => '127.0.0.1';
    use constant PORT => 21;
    use constant IPPROTO_TCP => 6;

    my $my_addr = shift || DEFAULT_ADDR;
    my $upak_addr = inet_aton($my_addr);
    my $dest = sockaddr_in(PORT,$upak_addr);
    socket(SOCK,PF_INET,SOCK_STREAM,IPPROTO_TCP) or
    die "Can`t open this socket!";
    connect(SOCK,$dest);
    print <SOCK>;

    Если соединение успешно,то просто выводит содержимое дескриптора сокета)).Но вот что можно запросить с помощью сокетов(какую информацию),и каким функциями пользоваться,кроме read().Или может есть у кого-то примеры работы на перле с сокетами ?
     
  2. biophreak

    biophreak Elder - Старейшина

    Joined:
    3 Aug 2007
    Messages:
    348
    Likes Received:
    63
    Reputations:
    15
    Запросить - хм...имхо доволоьно странная постановка вопроса...запросить можно толькто то, что может отдать сервак :))
    Кроме read() - sysread()
    примеры - http://phreak.nkoort.ru/source - пример работы с асечным серваком.
     
  3. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    пример , тупо читает страницу
    Code:
    #!"C:\xampp\perl\bin\perl.exe"
    
    use Socket;
    
    $port="80";
    
    
    socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
    
    
    $sockaddr_in = 'S n a4 x8';
    
    
    $in_addr = (gethostbyname("localhost"))[4];
    
    $server_addr = pack( $sockaddr_in, AF_INET, $port, $in_addr );
    
    connect(SOCK, $server_addr);
    send (SOCK, "GET / HTTP/1.0\n\n", 0);
    
    @data=<SOCK>;
    
    close(SOCK);
    
    
    print @data;
    exit(0);
     
  4. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Круто)))).Спасибо вам ребятки ^___________^.А что означают ваот эти две строчки:

    $in_addr = (gethostbyname("localhost"))[4];

    $server_addr = pack( $sockaddr_in, AF_INET, $port, $in_addr );

    Остальное вроде понятно=).А хотя... exit(0) это означает немедленный выход ?Смахивает на sleep() )

    ЗЫ: Только у меня страницу не выводит...локалхост.А по идее должен разве?)


    оО,ты забыл в скрипте поставить директиву my,тобишь глобальные переменные интерпретатор потребывал =_=,и вот насчёт директивы use strict не знаю,мне помогла)).Терь всё работает,ещё раз спасибо )))))
     
    #4 Велемир, 11 Jul 2008
    Last edited: 11 Jul 2008
  5. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    Code:
    $in_addr = (gethostbyname("localhost"))[4];
    узнаем айпи получателя по домену (вместо localhost может быть например google.com) , ай пи будет 4м параметром , возвращенным функцией gethostbyname ,который мы и поместим в переменную $in_addr

    Code:
    $sockaddr_in = 'S n a4 x8';
    Задаем шаблон для упаковки
    Code:
    $server_addr = pack( $sockaddr_in, AF_INET, $port, $in_addr );
    и упаковываем все наши данные согласно шаблону в двоичную структуру , которая необходима функции connect для установки соединения...

    надеюсь понятно обьяснил :)

    ps: а exit(0) обычный выход из программы

    added:
    замени localhost на google.com
    а в send поправь на
    send (SOCK, "GET / HTTP/1.0\nhost:google.com\n\n", 0);
    и увидишь результат
     
    #5 Jes, 11 Jul 2008
    Last edited: 11 Jul 2008
    1 person likes this.
  6. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Вроде всё понял.Думаю вот,че с этими сокетами делать )))