![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| rootcom |
|
|||
|
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 |
|
|||
|
Unregistered |
Проблема решилась.
Оказывается строки из сокета считывабтся нормально, последную строку не отдает STDOUT Отключил в скрипте буферизацию STDOUT все заработало. $| = 1; и поставил считывание по байтам while( sysread( $socket, $byte, 1) == 1 ){ print STDOUT $byte; } Теперь возникла другая проблема никак не могу принять файлы с помощью команды rz (zmodem) Может кто подсказать рецепт как перенаправить вход/выход программы в сокет ? |
|||
|
||||
| rootcom |
|
|||
|
Unregistered |
Проблема решилась.
Оказывается строки из сокета считывабтся нормально, последную строку не отдает STDOUT Отключил в скрипте буферизацию STDOUT все заработало. $| = 1; и поставил считывание по байтам while( sysread( $socket, $byte, 1) == 1 ){ print STDOUT $byte; } Теперь возникла другая проблема никак не могу принять файлы с помощью команды rz (zmodem) Может кто подсказать рецепт как перенаправить вход/выход программы в сокет ? |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 3 Всего: 28 |
Это же в рецептах указано, почему ты сразу не поставил. -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| rootcom |
|
|||
|
Unregistered |
А поповоду приема файлов по ZMODEM через сокет нет рецепта ?
|
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |