Проблема если в двух словах следующая: пишу на Perl сервер. Открываю сокет. Висит он у меня на каком-то порту. Требуется, что бы к этому порту могли подсоединяться сразу много клиентов. Одновременно. Как это в IRC сделано, например. Использую IO::SOCKET::INET
> Проблема если в двух словах следующая: пишу на Perl сервер. > Открываю сокет. Висит он у меня на каком-то порту. > Требуется, что бы к этому порту могли подсоединяться сразу > много клиентов. Одновременно. Как это в IRC сделано, > например. Использую IO::SOCKET::INET > > ПАМАГИТЕ!!!
не знаю как в perl'е а вот на С я делал так accept крутится в while и при подсоиденении каждого клиента создаётся новая нить по CreateThread
#include <winsock.h>
HANDLE HServer;
SOCKET SServer;
bool InitServer(unsigned int Port)
{
WORD SockVer=MAKEWORD(1,1);
WSADATA WsaData;
SOCKADDR_IN ServerAddr;
SECURITY_ATTRIBUTES sa;
Спасибо, помогло..
На случай если у кого будут такие проблемы, просто добавлю, что в Perl новые нити создаются с помощью функции fork(). (в PerlDoc описана в разделе perlfork)
только под win это не сработает =(08.06.04 09:28 Автор: noonv <Vladimir> Статус: Member
Угу, не сработает :-(
Правда я в сети нашел описание "асинхронных сокетов" - сокеты, которые, как я понял, поддерживают несколько соединений в пределах одного потока. Как раз WinAPI'шная фишка. Как в Перле сделать не знаю, но может кто чего подскажет?
my $sock = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => 9101,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1
);###
$sock or die "no socket :$!";
my($new_sock, $c_addr, $buf);
while (($new_sock, $c_addr) = $sock->accept()) {
my $pid = fork ()ie unless defined $pid;
if ($pid != 0){
close($sock);
while (defined ($buf = <$new_sock>)){
send ($new_sock, "Connect_OK \n",0);
print $buf;
}#####
print "EXIT \n";
exit;
}#####
close($new_sock);
}#####
Прада появляются defunct'ы (зомбики то есть). Посли добавления такой строчки $SIG{CHLD} = 'IGNORE'; становится всё гут.