Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Perl] Socket cоединение... 12.08.01 23:24
Автор: Access Статус: Незарегистрированный пользователь
|
Накиньте пример соединения с сервером.....
И посылка пакета или запроса (TCP)
А то прогу с си переделать не могу...
|
 |
[Perl] Socket cоединение... 14.08.01 02:53
Автор: free Статус: Незарегистрированный пользователь
|
> Накиньте пример соединения с сервером..... > И посылка пакета или запроса (TCP) > > А то прогу с си переделать не могу...
прототипы написаны на C.
perldoc Socket
perldoc IO::Socket
perldoc IO::Socket::INET
perldoc IO::Socket::UNIX
perldoc getpeername
perldoc POSIX
|
 |  |
[Perl] При получении виснет... 14.08.01 11:43
Автор: Access Статус: Незарегистрированный пользователь
|
Вот текст программы:
#!usr/bin/perl
use Socket;
socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
$remote_host="dialup.mtu.ru";
$remote_port=80;
$internet_addr = inet_aton($remote_host);
$paddr = sockaddr_in($remote_port,$internet_addr);
connect(SERVER,$paddr)||die "connect";
send (SERVER,"GET /index.htm HTTP/1.0\r\n",0);
recv(SERVER,$d,1,0);
close(SERVER);
Но при получении инфы из сокета (recv())прога подвисает, пока не отрубишься от инета.
Ещё один баг: если не закрывать сокет в конце проги, то не отсылается даже запрос send()???
|
 |  |  |
[Perl] При получении виснет... 16.08.01 06:11
Автор: free Статус: Незарегистрированный пользователь
|
> use Socket;
Почему не IO::Socket::INET или IO::Socket ?
> socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
после этого, желательно сказать setsockopt(..<настройки>..)
> $remote_host="dialup.mtu.ru"; > $remote_port=80; > $internet_addr = inet_aton($remote_host); > $paddr = sockaddr_in($remote_port,$internet_addr); > connect(SERVER,$paddr)||die "connect"; > send (SERVER,"GET /index.htm HTTP/1.0\r\n",0); > recv(SERVER,$d,1,0);
длина полученного сообщения превышает 1 байт (а может быть из за того, что setsockopt не сказал).
> close(SERVER); > > Но при получении инфы из сокета (recv())прога подвисает, > пока не отрубишься от инета.
Для такой (именно такой) задачи проще использовать HTTP::Request и LWP
> Ещё один баг: если не закрывать сокет в конце проги, то не > отсылается даже запрос send()???
Это не баг. (возможно создается сокет, который занят процессом, пока его не уьъешь(процесс) , естественно этот же сокет использовать нельзя)
|
 |  |  |  |
[Perl] А если... 16.08.01 06:18
Автор: free Статус: Незарегистрированный пользователь
|
> send (SERVER,"GET /index.htm HTTP/1.0\r\n",0); > recv(SERVER,$d,1,0);
Get /index.htm HTTP/1.0\r\n - вот такая штука возможно не пройдет.
Для такой (именно такой) задачи проще использовать
HTTP::Request и LWP - с ними можно очень лихо всякие посты и геты делать.
|
 |  |  |  |  |
Разобрался на половину 16.08.01 11:12
Автор: Access Статус: Незарегистрированный пользователь
|
> Get /index.htm HTTP/1.0\r\n - вот такая штука возможно не > пройдет.
Это я здурил: надо \n\n вместо \r\n (но от этого легче не стало)
А вот пример я надыбал, он рабочий:
use Socket;
$port=80;
$AF_INET=($] > 5 ? AF_INET : 2);
$SOCK_STREAM=($] > 5 ? SOCK_STREAM: 1);
$protocol=(getprotobyname('tcp'))[2];
$addr=(gethostbyname("dialup.mtu.ru"))[4];
$addrs=pack ('S n a4 x8', $AF_INET, $port, $addr); socket(LOAD,$AF_INET,SOCK_STREAM,$protocol)|die "Couldn`t create socket";
connect(LOAD, $addrs);
binmode (LOAD);
select(LOAD); $|=1;
select(STDOUT);
print LOAD "GET /index.htm HTTP/1.0\n\n";
binmode (STDOUT);
while (sysread (LOAD, $what, 2048)){
print $what;
Обьясни почему надобыло ставить binmode на LOAD???
|
 |  |  |  |  |  |
Разобрался на половину 17.08.01 06:28
Автор: free Статус: Незарегистрированный пользователь
|
> binmode (LOAD); > select(LOAD); $|=1; > select(STDOUT); > print LOAD "GET /index.htm HTTP/1.0\n\n";
> Обьясни почему надобыло ставить binmode на LOAD???
Птому что не все системы одинаково сохраняют в текстовые файлы esc-последовательности, введенные с клавиатуры ( симолы типа \n \r \t и т.п. )
Т.е. если файл создан в виндах, и мы пытаемся его прочитать как строку (как текстовый файл) из nix, то на месте \n будет совсем не \n (точно так же и с виндами),
для этого мужик и определил, что сокет является бинарным - чтобы искажений и глюков при чтении строк не происходило.
По поводу LWP - с его помощью можно виртуальный браузер создавать - удобнее (но не таком низком уровне, как с сокетами).
|
|
|