DiverD
написал 25 декабря 2006 года в 22:14 (2042 просмотра)
Ведет себя
неопределенно; открыл 7 тем в форуме, оставил 8 комментариев на сайте.
Вот код, я не могу сделать что бы клиенты которые конектятся могли видеть сообщение друг друга, для конекта можна использовать telnet.
#!/usr/bin/perl
#use strict;
use diagnostics;
use Socket;
use IO::Handle;
use constant PORT => 44444;
my @child = ();
SERVER->autoflush(1);
socket(SERVER,AF_INET,SOCK_STREAM,scalar getprotobyname('tcp')) or die "socket() failed : $!\n";
setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,1) or die "setsockopt() failed : $!\n";
my $sockIp = sockaddr_in(PORT,INADDR_ANY);
bind(SERVER,$sockIp) or die "bind() failed : $!\n";
listen(SERVER,SOMAXCONN) or die "listen() failed : $!\n";
print "Server port:",PORT,"\n";
pipe(R,W);
R->autoflush(1);
W->autoflush(1);
while(my $hisaddr = accept(CLIENT,SERVER)) {
CLIENT->autoflush(1);
next if $pid = fork();
die "fork() failed : $!\n" unless defined($pid);
close SERVER;
close W;
print while();
close R;
while() {
chomp;
print "[$$] Client say me : $_\n";
print CLIENT "You PID=$$\n";
}
close CLIENT;
exit(0);
} continue {
close R;
print W "OK\n";
close W;
print "[$$] Parent\n";
close CLIENT;
}
Если законектился одн клиент, то все нормал, если более, ты вылетает еррор о том что уже те дескрипторы с которых нужна читать и записывать уже давно закрыты, как решить проблему?
$ ./server.pl
Server port:44444
[1101] Parent
OK
[1103] Client say me : 1
[1103] Client say me : 2
print() on closed filehandle W at ./ppc_s.pl line 38 (#1)
(W closed) The filehandle you're printing on got itself closed sometime
before now. Check your control flow.
[1101] Parent
readline() on closed filehandle R at ./ppc_s.pl line 27 (#1)
(W closed) The filehandle you're reading from got itself closed sometime
before now. Check your control flow.
[1105] Client say me : HELLO
как я пайпы не создавал или FIFO использовал и UNIX-сокеты, ошибочный результат один и тот же. Мне сказали что с форкам такая беда не получится, хотя я сомневаюсь. Грубо говря я пишу чат консольный, знаю что можна это решить при помощи IO::Select, но все же мне нужен этот вариант.
Может тут нужна блок где то делать, вообщем прошу помочь..
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

ты создаешь pipe один раз и постоянно закрываешь его каналы. Когда конектится второй клиент канал уже закрыты. Вообще я не пойму идею этой программы. Напиши в комментариях как она должна работать.
вот-вот.
Вообщем это должен быть что та вроде чата.
К серверу конектятся клиенты, один клиент отправил сообщение а другие его получили — вот.!
Я не представляю как ты можешь обойтись без select. У тебя сервер должен делать два действия одновремменно, ждать новых клиентов и передавать сообщения между уже имеющимися. Варианты:
1)select;
2) Не знаю реализуемо ли это в perl, знаю его плохо. Читал у Стивенса что можно передавать дескриптор меджу процессами. Если это возможно в perl, создаешь два процесса сразу, один слушает сокет, второй обслуживает уже подключившихся. При подключении, первый процесс передает дескриптор второму и дальше слушает. Второй соответствено подключает нового клиента к чату. Но все равно тебе не обойтись без select во втором процессе, можно конечно делать polling, но select точно лучше.
ok, передача дискриптора возможна, с select-ом 100% получиться, проста я думал можна обайтись без него.
спаисбо, буду разбираться.
Лихо это у Стивенса. Можно пример в студию?
Насколько я знаю, передача дескрипторов возможна лишь в результате fork.
Смотри главу 14.7 «Unix разработка сетевых приложений», вроде бы можно найти исходники примеров к ней в электронном виде.
Нету у меня Стивенса. Сырцы скачал с
http://www.kohala.com/start/unpv12e/unpv12e.tar.gz
но найти там сорс к конкретной главе не представляется возможным.