Russian Qt Forum

Qt => Работа с сетью => Тема начата: Konstantin от Январь 28, 2009, 17:02



Название: Qt сервер.
Отправлено: Konstantin от Январь 28, 2009, 17:02
Добрый день, с qt сталкиваюсь впервые. Хотел бы узнать следующее.
Необходимо написать сервер с достаточно большой нагрузкой. Сервер должен становиться димоном и слушать определённый порт. Графического интерфейса не надо. Данные сервер должен считывать и посылать клиентам в утф-8.
Насколько просто это реализовать на qt? не могли бы вы привести простейший полный код подобного сервера (нечто вроде "hello world" только для потенциально-высоконагружаемого сервера), который я мог бы скомпилировать..а потом сам расширить так как мне надо.


Название: Re: Qt сервер.
Отправлено: Detonator от Январь 28, 2009, 18:45
Необходимо написать сервер с достаточно большой нагрузкой.

Сколько подключений в секунду, долговременные или нет? Сколько запросов? Какой траффик?
А то может тебе пример "hello world" только проблемой обернется если изначально нагрузка неправильно будет оценена.


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 28, 2009, 18:57
Сколько подключений в секунду, долговременные или нет? Сколько запросов? Какой траффик?
Подключений одновременно может быть около 1000 (несколько десятков тысяч пользователей в день). Каждый клиент может быть подключенным долговременно (полчаса, час, несколько часов). Обмен с сервером текстовой информацией: запросы в среднем около 1-10 кб со стороны сервера, а со стороны клиента - до килобайта. Частота запросов от одного клиента максимум раз в 3 секунды.


Название: Re: Qt сервер.
Отправлено: ритт от Январь 28, 2009, 19:03
threadedfortuneserver


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 28, 2009, 19:10
threadedfortuneserver
1000 потоков не будут тормозить сервер? этот пример на неблокирующих сокетах?


Название: Re: Qt сервер.
Отправлено: Detonator от Январь 28, 2009, 19:39
Система Windows? Или нужно кроссплатформенное?

Если только Windows то смотри Completion Port
http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
Поток на каждое соединение это тупик, под Windows точно.


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 28, 2009, 20:23
Система Windows? Или нужно кроссплатформенное?
нужно только linux


Название: Re: Qt сервер.
Отправлено: Detonator от Январь 28, 2009, 21:30
Ну тогда смотри aio_read() и выбирай версию линукса в котором он по честному реализован в ядре я не эмулируется путем отдельного потока на каждого пользователя:
"This model looks appealing, until we look under the hood of some aio_*() implementations. The Linux glibc implementation is a case in point: there is no kernel support. Instead, the C library (glibc 2.1) launches a thread per FD for which there are outstanding AIO requests (up to the maximum number of configured threads)."

Я сам в этом направлении для линукса еще мало копал, самому предстоит в будущем писать подобное приложение.

В общем мне кажется кусок обработки сообщений все же лучше сразу не на Qt писать, или по крайней мере разобраться с исходниками Qt чтобы быть уверенным что она без проблем обработает тысячи соединений без порождения отдельных потоков.


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 30, 2009, 11:07
Большое спасибо. Начал копать в сторону aio_read нашёл пример сервера и клиента
http://www.developerweb.net/forum/archive/index.php/t-3041.html

Цитировать
Minimum Requirements: OS390 V2R6 or higher.

OVERVIEW

Asynchronous I/O defined by UNIX 98 provides a high performance
capability to design a server that contains a pool of threads,
which will handle all I/O between the client and server. All
threads in the pool will be contained in one process. A pool
of 100 theads in this one server process can handle 10,000 or more
clint server sessions or sockets.

This tar file provides two sample client-server applications
which use asynchronous I/O and real time queued signals as
defined by UNIX 98. This sample server code also demonstrates
how to create thread pools to process the asynchronous I/O.
This sample code uses the following UNIX 98 APIs.

- aio_read, aio_write, aio_error, aio_return, aio_cancel
- sigwaitinfo

The basic client server programs are as follows where xxxx is
the server name such as server123.ibm.com.

- aio_server
- aio_client xxxxxxxx

The stress sample client server code is a more comprehesive sample
that can be used as a stress test. Again the xxxxxx is the server
name such as server123.ibm.com

- aio_server_stress
- aio_client_stress xxxxxx
Только не компилируется почему-то...
aio_server_stress.c:31: error: stray '\325' in program
Вот такие ошибочки выкидывает.. Может кто может мне ламеру? Буду благодарен


Название: Re: Qt сервер.
Отправлено: ритт от Январь 30, 2009, 11:52
там же ниже написано:
Цитировать
Those files on the IBM site are for a 390 series system and use EBCDIC... for each file do something like:

#cat INPUT_FILE | dd conv=ascii | sed -e 's/\x85/\n/g' > OUTPUT_FILE


Название: Re: Qt сервер.
Отправлено: ритт от Январь 30, 2009, 12:11
вотъ


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 30, 2009, 15:49
сделал это. не помогает, а выводит ту ошибку, про которую я говорил.


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 30, 2009, 16:45
На присланный вами архив уже ошибок меньше.. (все файлы в одну строчку) и выводит вот такие ошибки на файл aio_server_stress.c

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld returned 1 exit status

Спасибо


Название: Re: Qt сервер.
Отправлено: Konstantin от Январь 31, 2009, 11:14
Наткнулся на вот такую статью http://www.kegel.com/c10k.html, пишут что эффективно обработать 10 000 соединений одновременно под linu x (>=2.6) можно с помощью epoll. Интересно Qt поддерживает это? Или как его прикрутить. И надо ли вообще.


Название: Re: Qt сервер.
Отправлено: Tonal от Февраль 12, 2009, 11:25
Мож не мучатся и Erlang взять?
Он как раз на подобные задачи рассчитан...