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
Author: Sebastian Lukasiewicz
Date: Wed, 14 Jan 1998 06:19
Date: Wed, 14 Jan 1998 06:19
38 lines
1392 bytes
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
Author: Pawel Gajda
Date: Wed, 14 Jan 1998 09:51
Date: Wed, 14 Jan 1998 09:51
31 lines
1481 bytes
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
Author: Piotr Piatkowski
Date: Wed, 14 Jan 1998 11:58
Date: Wed, 14 Jan 1998 11:58
49 lines
2423 bytes
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
Author: Robert Richard George 'reptile' ...
Date: Wed, 14 Jan 1998 12:00
Date: Wed, 14 Jan 1998 12:00
52 lines
2695 bytes
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