🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
4 messages
4 total messages Started by Sebastian Lukasiewicz Wed, 14 Jan 1998 06:19
Perl i socket'y
#881
Author: Sebastian Lukasiewicz
Date: Wed, 14 Jan 1998 06:19
38 lines
1392 bytes
Czesc

Mam pytanko na temat programowania socket'ow w perlu

Otwieram polaczenie z serverem newsow w nastepujacy sposob :

#!/usr/bin/perl

use Socket;

$remote = $ARGV[0];
$port   = $ARGV[1];

$iaddr   = inet_aton($remote) || die "error\n";
$paddr   = sockaddr_in($port, $iaddr);
$proto   = getprotobyname('tcp');

socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || die "Socket error\n";
connect(SOCK, $paddr) || die "error\n";
while($line = <SOCK>)
{
	print $line;
}

Program sie laczy z serverem newsow i "wywala" taka linie :

200 lublin.pl InterNetNews NNRP server INN 1.5.1 17-Dec-1996 ready (posting ok).

Chce zapisac liste grup newsowych na jakas zmienna. Wiem ze nalezy wyslac
do serwera komende LIST. W jaki sposob mam przerobic ten programik zeby
zapisywal mi na zmienna liste grup newsowych?

Z gory dziekuje za pomoc w rozwiazaniu problemu.

Pozdrawiam

emial : d0roc@is.com.pl
Re: Perl i socket'y
#882
Author: Pawel Gajda
Date: Wed, 14 Jan 1998 09:51
31 lines
1481 bytes
Sebastian Lukasiewicz wrote:
> 
> Czesc
> 
> Mam pytanko na temat programowania socket'ow w perlu
> 
> Otwieram polaczenie z serverem newsow w nastepujacy sposob :
> 
[...]
> socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || die "Socket error\n";
> connect(SOCK, $paddr) || die "error\n";
> while($line = <SOCK>)
> {
>         print $line;
> }
> 
> Program sie laczy z serverem newsow i "wywala" taka linie :
> 
> 200 lublin.pl InterNetNews NNRP server INN 1.5.1 17-Dec-1996 ready (posting ok).
> 
> Chce zapisac liste grup newsowych na jakas zmienna. Wiem ze nalezy wyslac
> do serwera komende LIST. W jaki sposob mam przerobic ten programik zeby
> zapisywal mi na zmienna liste grup newsowych?

Nie znam za bardzo perla, ale powinienes do  
tego socketa cos zapisac, np LIST
A Ty oczekujesz, ze ten serwer po drugiej stronie  
bedzie wiedzial czego od niego chcesz.

pozdrawiam, 
Pawel
Re: Perl i socket'y
#883
Author: Piotr Piatkowski
Date: Wed, 14 Jan 1998 11:58
49 lines
2423 bytes
Sebastian Lukasiewicz <d0roc@kmicic.is.com.pl> wrote:

: socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || die "Socket error\n";
: connect(SOCK, $paddr) || die "error\n";
: while($line = <SOCK>)
: {
: 	print $line;
: }

: Program sie laczy z serverem newsow i "wywala" taka linie :

: 200 lublin.pl InterNetNews NNRP server INN 1.5.1 17-Dec-1996 ready (posting ok).

: Chce zapisac liste grup newsowych na jakas zmienna. Wiem ze nalezy wyslac
: do serwera komende LIST. W jaki sposob mam przerobic ten programik zeby
: zapisywal mi na zmienna liste grup newsowych?

Na początek wyłącz buforowanie tego socketa, żeby komenda print od 
razu przesyłała dane, a nie czekała aż się ich zbierze większa ilość:

select SOCK; $|=1; select stdout;

A później to już prosto:

# pobierz linię "powitalną" od serwera
$first_line = <SOCK>;
# pobierz listę
print SOCK "LIST\r\n";
while(<SOCK>) {
  chop; chop;
  last if /^\.$/;  # kropka kończy listę grup
  ( $grupa, $pierwszy_art, $ostatni_art, $moderowana ) = split;
  # tutaj wrzucasz do tablicy to co Cię interesuje, np:
  push @grupy, $grupa;
}

# A tutaj już można robić coś dalej, np. odczytać listę dostępnych 
# artykułów danej grupy przez LISTGROUP nazwa.grupy albo odczytać
# konkretny artykuł przez ARTICLE numer_artykułu

Zwróć uwagę, że praktycznie wszystkie protokoły zaznaczają koniec 
linii nie przez \n, a przez \r\n, z czym wiąże się konieczność 
obcięcia dwóch znaków z końca każdej linii, i dodania odpowiedniej 
sekwencji na końcu tego co się wpisuje w print.

P.S. Program nie sprawdzony, mogą być błędy :-)

-- 
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Perl i socket'y
#884
Author: Robert Richard George 'reptile' ...
Date: Wed, 14 Jan 1998 12:00
52 lines
2695 bytes
Nalezy tylko pamietac, ze jesli serwer moze podac odpowiedz kilkiliniowa,
to zakonczy ja linia zawierajaca ,,samotna'' kropke. Jesli odpowiedz bedzie
jednoliniowa, to konczyc ja bedzie para znakow <CR><LF>, wiec stosownie do
tego nalezy zonglowac metodami:

jesli oczekujemy odpowiedzi kilkuliniowej, to
   
      SOCK->input_record_separator("\r\n.\r\n");

Jesli oczekujemy odpowiedzi jednoliniowej, to

      SOCK->input_record_separator("\r\n");

#!/usr/bin/perl

use Socket;
use FileHandle;

$remote = $ARGV[0];
$port   = $ARGV[1];

$iaddr   = inet_aton($remote) || die "error\n";
$paddr   = sockaddr_in($port, $iaddr);
$proto   = getprotobyname('tcp');

socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || die "Socket error\n";
connect(SOCK, $paddr) || die "error\n";

SOCK->autoflush();
$line = <SOCK>;
print $line;
print SOCK "LIST\n";
SOCK->input_record_separator("\r\n.\r\n");
$listagrup = <SOCK>;
print SOCK "QUIT\n";
close(SOCK);

@lista = split(/\r\n/,$listagrup);
print join("\n",@lista)."\n";


Powodzenia w ujazmianiu perla zyczy

Gad

PS. Proponuje zainteresowac sie modulem IO:Socket, obsluga polaczen
sieciowych jest wtedy znacznie prostsza...

-- 
                                 mailto:reptile@pdi.net :)
                  Women are more complicated than PC... :(
          Look into my headers and you'll see who I am. :)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads