Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 сообщения, они то отправяться, но как один ответ, а мне надо их отправлять как отдельные друг от друга сообщения.
Спасибо
-
почему без отсоединения он не отправляет данные, такое ощущение что команда local $| = 1 не отключает буфер?
-
$| = 1 в самое начало
все остальное переписать. примеры есть в поставке перл и в сети.
например http://www.perlfect.com/articles/sockets.shtml
-
NeoNox
Спасибо за ссылку - я ее читал и примеры тоже куча была рассмотрена, тут меня больше всего беспокоит то что программа пишет в сокет но отправляет только после разрыва соединения, как я говорил такое ощущение что $| = 1 не работает, ставил его и в начало как ты посоветовал, но все равно тишина, кстати соединяюсь я не на localhost а на удаленный комп, может там ОС или еще что не дает отключить буферизацию? такое возможно? Серверную часть не знаю и какой там ОС не знаю.
На локальной машине нет проблем все пишется и отправляется