The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
программирование Socketов на perle, !*! Vasia, 09-Авг-01, 11:18  [смотреть все]
Народ, писал на "С" для сокетов. Все прекрасно. А как енто все работает на perlе? Может где все это описано человечаче? Или если не сложно и не жадно киньте простейший сэмпл tcp клиент/сервер!! Пожалуйста...
  • RE: программирование Socketов на perle, !*! XMan, 22:09 , 09-Авг-01 (1)
    Так это... "man perlfunc" на предмет socket, bind, accept, connect.
    Там есть все, что тебе нужно :))

  • RE: программирование Socketов на perle, !*! Dim, 01:05 , 10-Авг-01 (2)
    >Народ, писал на "С" для сокетов.
    >Все прекрасно. А как енто
    >все работает на perlе?

    Практически так же как и на Си, с небольшим отклонением синтаксиса.

    Как клиента писать можно подчерпнуть из множества скриптов, сервер пишется примерно так:

    use Socket;

    sub AF_INET {
       return 2;
    }
    sub SOCK_STREAM {
       return 1;
    }

    socket(S,AF_INET,SOCK_STREAM,$protocol) || die "socket : $!";
    setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1) || die "setsockopt : $!";
    setsockopt(S, IPPROTO_TCP, TCP_NODELAY, 1)  || die "setsockopt : $!";
    setsockopt (S, SOL_SOCKET, SO_LINGER, 0);
    setsockopt(S, SOL_SOCKET,SO_KEEPALIVE, 1)   || die "setsockopt : $!";

    my($sockaddr) = 'S n a4 x8';
    my($this) = pack($sockaddr, AF_INET, $port, "\0\0\0\0");
    while (!(bind(S, $this))) {
       if (! -t STDIN) { print "<br>\n"; }
       print "Waiting for port $port to free\n";
    exit;
       sleep(5);
    }
    listen(S, 50) || die "listen: $!";
    select(S);
    $| = 1;
    select(STDOUT);
    my($con) = 0;
    my($locs);
    if (fork()) {
      exit;
    }
    close(STDIN);
    close(STDOUT);
    close(STDERR);

    while (1) {
       $rin = $win = $ein = '';
       vec($rin, fileno(S), 1) = 1;

         ($numready, $timeleft) =  select($rout=$rin, undef, undef, undef);

       if (vec($rout, fileno(S), 1)) {
          $con  ;
          local *SOCKET;
          if(($addr = accept(SOCKET, S))) {
             $sockets{$con} = *SOCKET;
             select($sockets{$con});
             $|=1;
             select(STDOUT);

             ($af,$cport, $inetaddr) = unpack($sockaddr, $addr);
             undef $host;
        if (defined($thesocket) && vec($rout, fileno($thesocket), 1)){
                $data = substr(&readline($thesocket,0),0,1024);
        }
       }
    }

  • RE: программирование Socketов на perle, !*! Олег, 17:45 , 10-Авг-01 (4)
    Сходная проблема. Хотел написать крохотного клиента для телнет: войти запустить программу, выйти. Начал писать скрипт на перле.

    #!/usr/bin/perl
    use socket;  

    $server = "localhost";
    $port = 23;

    $server_addr =(gethostbyname($server))[4];
    $server_struct = pack("S n a4 x8", AF_INET, $port, $server_addr);

    $proto = (getprotobyname('tcp'))[2];
    socket(MYSOCK, PF_INET, SOCK_STREAM, $proto)||die "Error getting socket\n";

    connect(MYSOCK, $server_struct) || die "Connection error\n";
    select(MYSOCK);
    $| = 1;
    select(STDOUT);
    print MYSOCK "GET /\n\n";
    while (<MYSOCK>) {
       print;
    }
    close(MYSOCK);

    Думал, увижу на экране "трали-вали login: ". Вместо этого ничего не происходит. Netstat показывает соединение на 23 порт.

    С уважением
    Олег




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру