информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный сбой Azure и других сервисов... 
 Серьезный сбой AWS положил множество... 
 Фишинговая атака на Python-разработчиков 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Perl] Про Win 08.06.04 23:47  Число просмотров: 1499
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Угу, не сработает :-(
Правда я в сети нашел описание "асинхронных сокетов" - сокеты, которые, как я понял, поддерживают несколько соединений в пределах одного потока. Как раз WinAPI'шная фишка. Как в Перле сделать не знаю, но может кто чего подскажет?
<programming>
[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