Автор Тема: посоветуйте как правильно реализовать алгоритм  (Прочитано 2551 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mstf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Нужно написать 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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
почему без отсоединения он не отправляет данные, такое ощущение что команда local $| = 1 не отключает буфер?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
$| = 1 в самое начало
все остальное переписать. примеры есть в поставке перл и в сети.
например http://www.perlfect.com/articles/sockets.shtml
The documentations is your friend

Оффлайн mstf

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
NeoNox
Спасибо за ссылку - я ее читал и примеры тоже куча была рассмотрена, тут меня больше всего беспокоит то что программа пишет в сокет но отправляет только после разрыва соединения, как я говорил такое ощущение что $| = 1 не работает, ставил его и в начало как ты посоветовал, но все равно тишина, кстати соединяюсь я не на localhost а на удаленный комп, может там ОС или еще что не дает отключить буферизацию? такое возможно? Серверную часть не знаю и какой там ОС не знаю.

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28