Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP Клиент для приема передачи файлов по zmodem, считывание последней строки из сокета. 
:(
    Опции темы
rootcom
Дата 11.10.2005, 08:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пытаюсь написать TCP клиента для приема передачи фалов с использованием протокола zmodem. Сервером является BSS(RA) котроя висит на telnet порту (23).
Проблема возникла с считыванием последней строки из сокета.
----------------------------------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use encoding 'cp866', STDOUT => 'koi8-r';
use IO::Socket;

my (
$handle,
$kidpid,
$line
);

$handle = IO::Socket::INET->new( PeerAddr => "192.168.9.250",
PeerPort => "23",
Proto => "tcp")
or die "Could't connect to 192.168.9.250\n";

$handle->autoflush(1);
print STDOUT "Connect to 192.168.9.250:23\n";

die "can't fork: $!" unless defined( $kidpid = fork() );

if( $kidpid ) {
while( defined( $line = <$handle> ) ){
print STDOUT $line;
};

kill( "TERM" => $kidpid );
}
else {
while( defined( $line = <STDIN> ) ) {
$line =~ s/\n/\r\n/g;

print $handle $line;
}
}

exit;
------------------------------------------------------------------------------

Пробовал
while( sysread( $handle, $byte, 1 ) == 1 ) {
print STDOUT $byte;
};

не помогло.

Прочитал про алгоритм Нейгла, который буферизирует вывод/вывод на уровне операционной системы, попытался его отключить переписав скрипт предварительно с использованием use Socket; setsockopt(SOCKET, SOL_SOCKET, &TCP_NODELAY, 1) и преобразовав cd /usr/include ; h2ph *.h */*.h;
НЕ ПРОШЛО вываливается куча ошибок

Может, кто сталкивался с такими траблами?
Как получить последнюю строку?

OS linux red hat 9.0
perl 5.8.0


  Вверх
Guest
Дата 14.10.2005, 07:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблема решилась.
Оказывается строки из сокета считывабтся нормально, последную строку не отдает STDOUT

Отключил в скрипте буферизацию STDOUT все заработало.

$| = 1;

и поставил считывание по байтам

while( sysread( $socket, $byte, 1) == 1 ){
print STDOUT $byte;
}

Теперь возникла другая проблема
никак не могу принять файлы с помощью команды rz (zmodem)

Может кто подсказать рецепт как перенаправить вход/выход программы
в сокет ?

  Вверх
rootcom
Дата 14.10.2005, 07:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблема решилась.
Оказывается строки из сокета считывабтся нормально, последную строку не отдает STDOUT

Отключил в скрипте буферизацию STDOUT все заработало.

$| = 1;

и поставил считывание по байтам

while( sysread( $socket, $byte, 1) == 1 ){
print STDOUT $byte;
}

Теперь возникла другая проблема
никак не могу принять файлы с помощью команды rz (zmodem)

Может кто подсказать рецепт как перенаправить вход/выход программы
в сокет ?

  Вверх
sharq
Дата 15.10.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



Цитата(rootcom @ 14.10.2005, 08:24)
$| = 1;

и поставил считывание по байтам

while( sysread( $socket, $byte, 1) == 1 ){
print STDOUT $byte;
}


Это же в рецептах указано, почему ты сразу не поставил. smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
rootcom
Дата 17.10.2005, 15:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А поповоду приема файлов по ZMODEM через сокет нет рецепта ?
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.