#!/usr/bin/perl
use IO::Socket;
$port=4141;
$bind=IO::Socket::INET->new(Listen=>5,LocalPort=>$port);
$client=$bind->accept();
$client->send("Тру-ля-ля");
$client2=$bind->accept();
$client2->send("Ля-ля-тру");
close($client);
close($client2);
close($bind);
Насколько я понимаю, алгоритм должен работать так:
1. Открыли сокетку;
2. Ждём соединения;
3. При первом соединении приняли его и передали открывающей стороне "Тру-ля-ля";
4. Держим первое соединение открытым и ждём второго соединения;
5. Дождались второго соединения, передали открывающей стороне "Ля-ля-тру";
6. Прикрыли все соединения и ждущую сокетку, вышли.
На деле всё работает так:
1. Открыли сокетку;
2. Ждём соединения;
3. Приняли первое соединение и передали туда "Тру-ля-ля";
4. Стоим колом пока прицепившаяся сторона не закроет первое соединение;
5. Ждём второго соединения;
6. Дождались, передали "Ля-ля-тру";
7. Прикрыли всё, вышли.
Подскажите заставить всё работать с двумя одновременно открытыми соединениями?
Собственно задача моя проста - написать многопоочный сервер, который мог бы держать несколько соединений одновременно, при этом не нагружая сервер по самое "мама не горюй".
Нашел какие-то исходники в сети, где было в общих чертах так:
#!/usr/bin/perl
use IO::Socket;
$SIG{CHLD}='IGNORE';
$port=4141;
$bind=IO::Socket::INET->new(Listen=>5,LocalPort=>$port);
while ($client=$bind->accept()){
$pid = fork();
unless(defined($pid)){close($bind); exit;}
if ($pid){
close($client);
}else{
$client->send("Тру-ля-ля");
sleep(100); # подразумеваются некие действия с открытым соединением
close($client);
exit;
}
} # while ($client=$bind->accept())
Вот только проблема точно такая, то есть после первого accept() пока не закрыто первое соединение, второе соединение не аццептиться, accept() просто висит и ждёт пока прикроют первое соединение.
Подскажите чем смазать лыжи, что бы ехать?
Или плиз покажите код (ссылку на код) скрипта, который есть многопоточный tcp сервер (а не сервер, который последовательно обрабатывает все приходящие соединения (таких в сети полно видел)).