The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"accept() - многопоточность не пошла :("
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"accept() - многопоточность не пошла :(" 
Сообщение от exec Искать по авторуВ закладки(ok) on 05-Ноя-05, 20:02  (MSK)
#!/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 сервер (а не сервер, который последовательно обрабатывает все приходящие соединения (таких в сети полно видел)).

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "accept() - многопоточность не пошла :(" 
Сообщение от jd Искать по авторуВ закладки(??) on 05-Ноя-05, 22:50  (MSK)
У меня ваш код работает нормально.
Рекомендую делать перед закрытием сокета shutdown (это к данному вопросу не относится).
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "accept() - многопоточность не пошла :(" 
Сообщение от ACCA Искать по авторуВ закладки(ok) on 06-Ноя-05, 00:04  (MSK)
>закрыто первое соединение, второе соединение не аццептиться, accept() просто висит и
>ждёт пока прикроют первое соединение.

В Windows так и должно быть - у него fork нету. Если у тебя *nix, то проверь лимиты - сколько ещё процессов ты имеешь право создать?


>Или плиз покажите код (ссылку на код) скрипта, который есть многопоточный tcp
>сервер (а не сервер, который последовательно обрабатывает все приходящие

Твой кусок - нормальный многопоточный сервер. На каждое соединение он создаёт процесс с помощью fork и потом каждый процесс работает с клиентом.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "accept() - многопоточность не пошла :(" 
Сообщение от rWizard emailИскать по авторуВ закладки(??) on 06-Ноя-05, 07:33  (MSK)
в дополнение - обратите внимание на модуль IO::NonBlocking
позволяет создать tcp сервер, обрабатывающий множество соединений в одном потоке
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "accept() - многопоточность не пошла :(" 
Сообщение от exec Искать по авторуВ закладки(ok) on 07-Ноя-05, 03:46  (MSK)
Господа, уверен, будете смеяться.
Проверял те коды что привёл здесь на домашней ЭВМ (linux RH) - не работало... Загрузил на сервер, работает на ура.
Перекачал с cpan  на домашний ЭВМ и переставил модуль IO::Socket всё заработало.
Вот так иногда бывает, что на диске с дистрибутивом линуха был кривой модуль...
Честное слово, если бы не подсказали что код рабочий, с ума бы сошел в поисках вкопаной в алгоритм собаки.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру