LINUX.ORG.RU

Сервер для чата


0

0

Получилось сделать так чтобы каждый клиент параллельно обрабатывался в отдельном процессе..
Но не получается сделать так чтобы после посылки одним из клиентов сообщения, Это сообщение рассылалось сервером всем остальным клиентам.
Кусок кода:

listen(listener, 1);

while(1)
{
sock = accept(listener, NULL, NULL);
if(sock < 0)
{
perror("accept");
exit(3);
}

switch(fork())
{
case -1:
perror("fork");
break;

case 0:
close(listener);
while(1)
{
bytes_read = recv(sock, buf, 1024, 0);
if(bytes_read <= 0) break;
}


_exit(0);
}
send(sock, buf, bytes_read, 0);

}


>> Получилось сделать так чтобы каждый клиент параллельно обрабатывался в отдельном процессе..

А в чём смысл такого подхода? Не проще ли сделать через select например?

Deleted
()

[Erlang] Ну ты понял, да.

В наше время писать сервера на Си - удел аристократов и дегенератов.

dark_mikhail
()
Ответ на: комментарий от Deleted

> А в чём смысл такого подхода?

<off> Чтобы было 2 мегабайта на клиента, энтерпрайз. Потом будут тюнить размер стека, ища минимальный, при котором сегфолт будет пореже.

Legioner ★★★★★
()

Нужно сделать обработку всех клиентов в одном процессе в один поток. Если сделать несколько процессов -- "бутылочным горлышком" будет обмен данными между процессами (он только через вызовы ядра, а это постоянные переключения контекста). Если сделать через потоки -- то программа будет тормозить на блокировках (когда будет много клиентов, почти все потоки будут ждать блокировки, чтобы разослать своё сообщение).

anonymous
()
Ответ на: комментарий от anonymous

>Нужно сделать обработку всех клиентов в одном процессе в один поток.

тогда все будет просто аццки тормозить... замечательный совет.. ага..

anonymous
()
Ответ на: комментарий от anonymous

>> тогда все будет просто аццки тормозить... замечательный совет.. ага..

Автор первопоста не сказал на сколько клиентов чат он делает. Если клиентов пара десятков - заглаза хватит даже одного потока с мультиплексированием через select. В случае десятков-сотен, select придётся заменить на что-нибудь более удобное (poll/epoll/etc), но одного потока думаю всё равно хватит. А если клиентов дофига, то тут уже рулят смешанные решения (несколько потоков, каждый из которых обрабатывает какое-то кол-во клиентов): google << "C10k problem".

Deleted
()

нафига бы вообще свои сервера писать? Юзайте ejabberd и не имейте проблем.

INFOMAN ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.