powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоковый сервер на С++
25 сообщений из 94, страница 1 из 4
Потоковый сервер на С++
    #38208109
kiruhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Стала задача написать сервер на плюсах (под линукс). Признаться, данный язык только начал осваивать, поэтому могу показаться совсем уж нубом (за что прошу больно не пинать :) ). Итак, задача:
1. Реализация потокового (pre-thread) сервера на С++ под Linux (GNU)
2. В данном случае не оговариваются действия сервера (его логика - это сам осилю), а только грамотное построение модели (принял - передал)
3. Подчеркиваю - код для Linux
Начал с того, что гуглил много. В итоге нашел некий "пример" (код ниже), который взял за основу, которую в последствии буду "допиливать". Итак, код был взят отсюда:
http://www.unix.com/programming/17611-multi-threaded-server-pthreads-sleep.html
Дублирую код в топик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
#include <pthread.h>
#include <stdio.h>
#include <sys/timeb.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>

#define MAX_CLIENT_PER_THREAD 300
#define MAX_THREAD 200
#define PORT 3355
#define MAX_CLIENT_BUFFER 256
/*#define DEBUG*/

int listenfd;

typedef struct {
	pthread_t tid;
	int client_count;
	int clients[MAX_CLIENT_PER_THREAD];
} Thread;

pthread_cond_t new_connection_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t new_connection_mutex = PTHREAD_MUTEX_INITIALIZER;


Thread threads[MAX_THREAD];

void nonblock(int sockfd)
{
	int opts;
	opts = fcntl(sockfd, F_GETFL);
	if(opts < 0)
	{
		perror("fcntl(F_GETFL)\n");
		exit(1);
	}
	opts = (opts | O_NONBLOCK);
	if(fcntl(sockfd, F_SETFL, opts) < 0) 
	{
		perror("fcntl(F_SETFL)\n");
		exit(1);
	}
}

void *thread_init_func(void *arg)
{
	int tid = (int) arg;
	
	int readsocks;
	int i;
	char buffer[MAX_CLIENT_BUFFER];
	char c;
	int n;
#ifdef DEBUG
	printf("thread %d created\n", tid);
	printf("sizeof thread.clients: %d\n", sizeof(threads[tid].clients));
#endif
	memset((int *) &threads[tid].clients, 0, sizeof(threads[tid].clients));
	memset((char *) &buffer, 0, sizeof(buffer));	
	while(1)
	{
#ifdef DEBUG
		printf("thread %d running, client count: %d\n", tid, threads[tid].client_count);
		sleep(3);
#endif
		sleep(1); /* <-- it works ??? :-| */

		for(i = 0; i < MAX_CLIENT_PER_THREAD; i++)
		{
			if(threads[tid].clients[i] != 0)
			{
				n = recv(threads[tid].clients[i], buffer, MAX_CLIENT_BUFFER, 0);
				if(n == 0)
				{
#ifdef DEBUG
					printf("client %d closed connection 0\n", threads[tid].clients[i]);
#endif
					threads[tid].clients[i] = 0;
					threads[tid].client_count--;
					memset((char *) &buffer, 0, strlen(buffer));
				}
				else if(n < 0)
				{
					if(errno == EAGAIN)
					{
#ifdef DEBUG
						printf("errno: EAGAIN\n");
#endif
					}
					else {
#ifdef DEBUG
						printf("errno: %d\n", errno);
#endif
						threads[tid].clients[i] = 0;
						threads[tid].client_count--;
						memset( (char *) &buffer, 0, strlen(buffer));
#ifdef DEBUG
						printf("client %d closed connection -1\n", threads[tid].clients[i]);
#endif
					}
				}
				else {
#ifdef DEBUG
					printf("%d bytes received from %d - %s\n", n, threads[tid].clients[i], buffer);
#endif
					
					send(threads[tid].clients[i], buffer, strlen(buffer), 0);
					memset((char *) &buffer, 0, strlen(buffer));
				}
			}
		}
	}
}

int choose_thread()
{
	int i=MAX_THREAD-1;
	int min = 0;
	while(i > -1)
	{
		if(threads[i].client_count < threads[i-1].client_count)
		{
			min = i;
			break;
		}
		i--;
	}		
	return min;
}

int main()
{
	char c;
	struct sockaddr_in srv, cli;
	int clifd;
	int tid;
	int i;
	int choosen;

	signal(SIGPIPE, SIG_IGN);
	
	if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("sockfd\n");
		exit(1);
	}
	bzero(&srv, sizeof(srv));
	srv.sin_family = AF_INET;
	srv.sin_addr.s_addr = INADDR_ANY;
	srv.sin_port = htons(PORT);

	if( bind(listenfd, (struct sockaddr *) &srv, sizeof(srv)) < 0)
	{
		perror("bind\n");
		exit(1);
	}
	
	listen(listenfd, 1024);

	
	/* create threads  */
	for(i = 0; i < MAX_THREAD; i++)
	{
		pthread_create(&threads[i].tid, NULL, &thread_init_func, (void *) i);
		threads[i].client_count = 0;
	}
	

	for( ; ; )
	{
		clifd = accept(listenfd, NULL, NULL);
		nonblock(clifd);

		pthread_mutex_lock(&new_connection_mutex);
		
		choosen = choose_thread();

		for(i = 0; i < MAX_CLIENT_PER_THREAD; i++)
		{
			if(threads[choosen].clients[i] == 0)
			{
#ifdef DEBUG
				printf("before threads clifd\n");
#endif
				threads[choosen].clients[i] = clifd;
#ifdef DEBUG
				printf("after threads clifd\n");
#endif
				threads[choosen].client_count++;
				break;
			}
		}

#ifdef DEBUG
		printf("choosen: %d\n", choosen);

		for(i = 0; i < MAX_THREAD; i++)
		{
			printf("threads[%d].client_count:%d\n", i, threads[i].client_count);
		}
#endif

		pthread_mutex_unlock(&new_connection_mutex);
	}

	if(errno)
	{
		printf("errno: %d", errno);
	}
	
	return 0;
}


Сам автор этого кода, в своем посте пишет:
"I am trying to writa a multi-client & multi-threaded TCP server.
There is a thread pool. Each thread in the pool will handle
requests of multiple clients.

But here I have a problem. I find a solution but it is not how
it must be... i think. When threads working without sleep(1)
I can't get response from server but when I put sleep(1) in
thread function as you will see in code, everything works fine
and server can make echo nearly for 40000 clients between
1 or 2 seconds. What am I doing wrong here?
"
И это действительно так. С одной оговоркой, что если заккоментировать sleep(1), то это сервер работает именно так, как нужно, НО вводит систему в ступор (загрузка ЦП 100%, что очевидно, т.к. while(1) ) С другой стороны, из-за этого sleep(1), во-первых, ответ сервера возвращается только через секунду, во-вторых, если передать серверу несколько пакетов (передать быстро), то он "склеит" это пакеты в один, как следствие, пакеты невозможно будет разобрать.
Пожалуйста, подскажите:
1. Если приведенный пример (код, взятый за основу) корректный - как можно избежать sleep (1)?
2. Если код в своей основе неверный (или морально устарел, т.к. пост датируется аж 2005 годом) - помогите собрать этот покотовый сервер (хоть пример реально работающего)
3. Обязательно ли объявлять сокет неблокируемым (как в приведенном примере)?
Спасибо огромное!
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208113
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhin,

Посмотрите в сторону, напримре, libev
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208182
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhin,

Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
while(1)
{
	for(i = 0; i < MAX_CLIENT_PER_THREAD; i++)
	{
 	    	n = recv(threads[tid].clients[i], buffer, MAX_CLIENT_BUFFER, 0);
 	    	...
	}
	...
}



Используйте функцию select() для выбора сокетов по которым прибыли данные.
Это если просто шоб работало хоть как-то.
А если правильно делать, с нормальной производительностью при большом числе клиентов, то выше посоветовали библиотеку которая реализует все как надо. Там доках наверняка готовые примеры есть. Таких библиотек несколько.

ЗЫ. А вообще, это конечно никакой не С++, а голый С. Для С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208183
Anatoly MoskovskyЗЫ. А вообще, это конечно никакой не С++, а голый С. Для С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков.
А он как по производительности относительно libev/libevent, не уступает им?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208186
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
относительно libev libeventДля С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков.
А он как по производительности относительно libev/libevent, не уступает им?
Архитектурно - не уступает.
А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208188
Anatoly Moskovskyотносительно libev libeventпропущено...

А он как по производительности относительно libev/libevent, не уступает им?
Архитектурно - не уступает.
А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи
Вот тут " Неблокируемые и асинхронные приложения " утверждают, что в libevent используются "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows", а для libev "в ОС Windows используется вызов select" и это якобы медленнее, чем IOCP.
Правда ли это архитектурно и что используется в ASIO: IOCP или select?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208193
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
относительно libev libeventAnatoly Moskovskyпропущено...

Архитектурно - не уступает.
А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи
Вот тут " Неблокируемые и асинхронные приложения " утверждают, что в libevent используются "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows", а для libev "в ОС Windows используется вызов select" и это якобы медленнее, чем IOCP.
Правда ли это архитектурно и что используется в ASIO: IOCP или select?
Несколько лет назад я работал с libevent - под виндой оно умело только select.
Как счас - не знаю, видимо уже сделали, раз говорят об этом :)
Boost.Asio с давних пор (возможно изначально) использует "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows".
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208275
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот, чтобы не наркоманствовать с тем, что делает ТС, и придумали nginx, uWSGI и прочие радости.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208310
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZТак вот, чтобы не наркоманствовать с тем, что делает ТС, и придумали nginx, uWSGI и прочие радости.
ну предположим - диплом. Чего сразу - наркоманствовать? Учиться...
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208532
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskykiruhin,

Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
while(1)
{
	for(i = 0; i < MAX_CLIENT_PER_THREAD; i++)
	{
 	    	n = recv(threads[tid].clients[i], buffer, MAX_CLIENT_BUFFER, 0);
 	    	...
	}
	...
}



Используйте функцию select() для выбора сокетов по которым прибыли данные.
Это если просто шоб работало хоть как-то.


+getsockopt у него есть параметры , которые возвращают обьем
принятого в сетевой стек буфера, которые можно считать если там что то есть или не читать если нет.

Что касается

kiruhinесли передать серверу несколько пакетов (передать быстро), то он "склеит" это пакеты в один, как следствие, пакеты невозможно будет разобрать.


То на уровне сокета, пытаться поделить безидейно,
протокол более высокого уровня должен иметь соотвествующие хедеры и (или) трейлеры, якоря
для позиционированя парсера в потоке .
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208556
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить про select() , он должен быть один на все сокеты программе.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208695
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой сервер должен просто висеть на select или poll/epoll и ждать ввода-вывода (сетевого), который будет инициирован клиентом.
Как только он возбуждается -- отдавать сокет на обработку рабочему потоку, который должен сделать всё, что нужно, отправить всё клиенту, возможно, и обратно отдать сокет на прослушку select-у или poll/epoll-у.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208722
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает.

Я тут хочу сделать одно замечание. Конечно, busy wait не великолепная штука, конечно, это не очень хорошо. А тут не подходит вообще.
Но вот почему-то все считают его абсолютным неоспариваемым смертным грехом в программировании.
А это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен.
Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для
того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208833
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен.
Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для
того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе.

Это вопрос дизайна архитектуры .
Нить всеравно когда то отдаст свой контекст выполнения, количество тактов которые делает нить между синхронизирующими событиями должен приблизительно ( хотя бы до порядка) соотвествовать длине контекста выполнения в планировщие,
Я хочу сказать о том, что если управление передается нити , то у нее должно
быть достаточно работы, что бы не греть процессоры спинлоком.
Если появилась необходимость в спинлоках , нужно (желательно ) об этом горомко заявить в консерватории.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208862
ДохтаРMasterZivА это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен.
Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для
того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе.

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

Мало того, нить может почти никогда и не отдавать контекст, будучи привязанной к одному из 32 ядер сервера, на котором помимо ОС только одна эта система и работает.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208880
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРЕсли говорить про select() , он должен быть один на все сокеты программе.

Даже если их больше, чем в него влазит?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208909
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
моментальная реакцияЕсть два варианта:
1. Необходима моментальная реакция на события и некогда ждать пока для нити появиться "достаточно работы". Например брокерская система, где, очевидно, выгодная сделка будет у того, чей сервер первым её вычислит и кинет заявку.


Для таких случаев рисуется невытесняющая пользовательская многозадачность нутри одной нити ( процесса),
на количестве нитей равном количеству процессоров ( ядер) - 1( для ядра ОС).
Нити ОС всервно чью брокерскую транзакцию она выполняет.


моментальная реакцияМало того, нить может почти никогда и не отдавать контекст, будучи привязанной к одному из 32 ядер сервера, на котором помимо ОС только одна эта система и работает.

Да, для того что бы нить никогда не отдавала контексты, из схемы выше ,
процессор афинити жестко прикручивают шуруповертом к нити ( процессу).

А ввод вывод делается полность асинхронным, что бы не спать , когда есть работа для нити,
пусть ДМА работает.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208917
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работа, которая описана выше , интересная , но сейчас такой нет, быдлокод кругом.
Грамотная архитектура никому не интересна , за нее не платят.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208945
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДохтаРЕсли говорить про select() , он должен быть один на все сокеты программе.

Даже если их больше, чем в него влазит?..


Насколько я помню в него помещается 65535 сокетов.
В хайлодае уже на 1024-х на производительности сказывается его псевдоасинхронность.
Дальше дорога в АИО.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38208965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРНасколько я помню в него помещается 65535 сокетов.

Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве
непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209006
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДохтаРНасколько я помню в него помещается 65535 сокетов.

Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве
непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен".


Я сказал помещается ( можно впихнуть), реально если важен перфоманс
то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора).
Можно нарисовать велосипед на тему select на SIGIO.
В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO
прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) .

Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209085
ДохтаРРабота, которая описана выше , интересная , но сейчас такой нет, быдлокод кругом.
Грамотная архитектура никому не интересна , за нее не платят.
Да ладно, сейчас есть задачи и поинтересней. Не пользовательская многозадачность, а хардварная, на GPU с 40000 виртуальных ядер на один чип, и 80000 - 320000 на сервер. И DMA обмен с периферией.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209324
Фотография MedEx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я бы выбрал Qt фрейморк 4.8.
Постороение на нём кроссплатформенного "полноприводного", параллельно-многопоточного(QtConcurent) http сервера есть видеоурок на тытрубке.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209495
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаРDimitry Sibiryakovпропущено...

Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве
непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен".


Я сказал помещается ( можно впихнуть), реально если важен перфоманс
то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора).
Можно нарисовать велосипед на тему select на SIGIO.
В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO
прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) .

Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов.
Текущая имплементация aio для сокетов не является асинхронной
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209677
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WesttrdДохтаР
Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов.
Текущая имплементация aio для сокетов не является асинхронной


http://www.ibm.com/developerworks/linux/library/l-async/
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоковый сервер на С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]