информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[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'; становится всё гут.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach