Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Perl] Сокеты.. 07.06.04 01:17
Автор: Heller <Heller> Статус: Elderman
|
Проблема если в двух словах следующая: пишу на Perl сервер. Открываю сокет. Висит он у меня на каком-то порту. Требуется, что бы к этому порту могли подсоединяться сразу много клиентов. Одновременно. Как это в IRC сделано, например. Использую IO::SOCKET::INET
ПАМАГИТЕ!!!
|
 |
fork 09.06.04 15:04
Автор: choor Статус: Elderman
|
|
|
 |
[C++] [Perl] Сокеты.. 07.06.04 16:33
Автор: Tamas Статус: Member
|
> Проблема если в двух словах следующая: пишу на 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;
unsigned long ThreadId;
bool DontLinger=true;
memset(&OsVerInfo,0, sizeof(OSVERSIONINFO));
OsVerInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if(!GetVersionEx(&OsVerInfo))return false;
DeinitServer();
if(WSAStartup(SockVer,&WsaData))return false;
if((SServer=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)return false;
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(Port);
ServerAddr.sin_addr.s_addr=INADDR_ANY;
if(bind(SServer,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
closesocket(SServer);
return false;
}
if(listen(SServer,SOMAXCONN)==SOCKET_ERROR)
{
closesocket(SServer);
return false;
}
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=true;
if((HServer=CreateThread(NULL,0,Server,NULL,0,&ThreadId))==NULL)
{
closesocket(SServer);
return false;
}
return true;
}
void DeinitServer()
{
closesocket(SServer);
TerminateThread(HServer,0);
}
DWORD WINAPI Server(LPVOID Param)
{
SECURITY_ATTRIBUTES sa;
unsigned long ThreadId;
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=true;
while((ClientInfo.Socket=accept(SServer,NULL,NULL))!=INVALID_SOCKET)
{
sleep(1);
CreateThread(&sa,0,Client,NULL,0,&ThreadId);
}
return 0;
}
DWORD WINAPI Client(LPVOID Param)
{
return 0;
}
|
 |  |
[Perl] [C++] [Perl] Сокеты.. 08.06.04 00:55
Автор: Heller <Heller> Статус: Elderman
|
Спасибо, помогло..
На случай если у кого будут такие проблемы, просто добавлю, что в Perl новые нити создаются с помощью функции fork(). (в PerlDoc описана в разделе perlfork)
|
 |  |  |
только под win это не сработает =( 08.06.04 09:28
Автор: noonv <Vladimir> Статус: Member
|
|
|
 |  |  |  |
[Perl] Про Win 08.06.04 23:47
Автор: Heller <Heller> Статус: Elderman
|
Угу, не сработает :-(
Правда я в сети нашел описание "асинхронных сокетов" - сокеты, которые, как я понял, поддерживают несколько соединений в пределах одного потока. Как раз WinAPI'шная фишка. Как в Перле сделать не знаю, но может кто чего подскажет?
|
 |  |  |  |  |
[Perl] Код 10.06.04 23:17
Автор: Heller <Heller> Статус: Elderman
|
#!/usr/bin/perl -w
#use strict;
use IO::Socket;
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'; становится всё гут.
|
|
|