Forum Webscript.Ru

Программирование => Perl => Тема начата: mstf от 05 Июля 2005, 16:50:33

Название: посоветуйте как правильно реализовать алгоритм
Отправлено: mstf от 05 Июля 2005, 16:50:33
Нужно написать tcp клиента, который постоянно слушал бы порт и при поступлении сообщений на порт сразу же писал ответ и продолжал слушать.

Я написал так, хотя это наверно и не верно

#!/usr/bin/perl -w
    use strict;
   use IO::Socket;
   my $host = \'localhost\';
   my $port = 2345;

while (1){
    my $socket = new IO::Socket::INET (
                                    PeerAddr  => $host,
                                    PeerPort  => $port,
                                    Proto => "tcp",
                                    Type => SOCK_STREAM)
           or die "NE MOGU $port NA $host: $!";
        local $| = 1;

        print ( "It is work\\n");

        if (defined (my $response = <$socket>)){
        print ("Form sms-gate: $response");
        my @parse_arr = split(/\\|/,$response);
        print ($socket "$parse_arr[0]|$parse_arr[1]|$parse_arr[2]\\n");
        }

        print("done\\n");
close ($socket) or die ("i can\'t");
}

то есть я зациклил и программа постоянно слушает порт, получило сообщение пишет чтото в порт, отсоединяется и по новой соединяется и слушает порт. Знаю, что это изврат, но по другому у меня не получается додумать. Если пишу без while (1){ , а вместо if (defined (my $response = <$socket>)){ пишу while (defined (my $response = <$socket>)){  , то программа тоже слушает порт,все сообщения принимает, вроде пишет ответы в порт, НО не отправляет, а отправляет только при разрыве соединения. Может я не совсем понял суть работы с портами? Подскажите как можно написать грамотней. Потому что при существующем алгоритме сложно будет отправлять в порт к примеру 3 сообщения, они то отправяться, но как один ответ, а мне надо их отправлять как отдельные друг от друга сообщения.

Спасибо
Название: посоветуйте как правильно реализовать алгоритм
Отправлено: mstf от 05 Июля 2005, 17:38:17
почему без отсоединения он не отправляет данные, такое ощущение что команда local $| = 1 не отключает буфер?
Название: посоветуйте как правильно реализовать алгоритм
Отправлено: NeoNox от 05 Июля 2005, 18:44:24
$| = 1 в самое начало
все остальное переписать. примеры есть в поставке перл и в сети.
например http://www.perlfect.com/articles/sockets.shtml
Название: посоветуйте как правильно реализовать алгоритм
Отправлено: mstf от 06 Июля 2005, 09:33:24
NeoNox
Спасибо за ссылку - я ее читал и примеры тоже куча была рассмотрена, тут меня больше всего беспокоит то что программа пишет в сокет но отправляет только после разрыва соединения, как я говорил такое ощущение что $| = 1 не работает, ставил его и в начало как ты посоветовал, но все равно тишина, кстати соединяюсь я не на localhost а на удаленный комп, может там ОС или еще что не дает отключить буферизацию? такое возможно? Серверную часть не знаю и какой там ОС не знаю.

На локальной машине нет проблем все пишется и отправляется