2015-06-29 3 views
0

Я хочу реализовать многопоточность на сервере Libsoup, так что каждый раз, когда клиентский запрос приходит, будет создан новый поток для обслуживания этого запроса. Как я могу реализовать это, используя библиотеки Libsoup и GLib?Как реализовать многопоточность на сервере Libsoup?

Мой текущий сервер основной код выглядит так:

sending_file = fopen("abc/project_foo.zip", "r"); 
fseek(sending_file, 0L, SEEK_END); 
size_of_file = ftell(sending_file); 
fseek(sending_file, 0L, SEEK_SET); 
int port = 15000; 

server = soup_server_new(SOUP_SERVER_RAW_PATHS,TRUE,SOUP_SERVER_PORT,port, SOUP_SERVER_SERVER_HEADER,"simple-httpd",NULL); 


soup_server_add_handler(server , "/foo" , server_callback, NULL , NULL); 
soup_server_run_async (server); 

printf("Waiting for Requests...\n"); 

//Running a main loop so Async will work 
GMainLoop *loop; 
loop = g_main_loop_new (NULL, TRUE); 
g_main_loop_run (loop); 
return 0; 
+0

Просьба поделиться любыми подходами, которые вы пробовали до сих пор. – ndmeiri

+0

Я добавил свой главный код функции –

ответ

1

Создать новую тему в обратном вызове вы передаете soup_server_add_handler. manual explains the rest; соответствующая деталь:

По умолчанию libsoup предполагает, что вы полностью завершили обработку сообщения при возврате из обратного вызова и что поэтому он может начать отправку ответа. Если вы не готовы немедленно отправить ответ (например, вам нужно связаться с другим сервером или дождаться данных из базы данных), вы должны позвонить soup_server_pause_message в сообщении, прежде чем вернуться из обратного вызова. Это задержит отправку ответа, пока вы не назовете soup_server_unpause_message. (Вы также должны подключиться к finished сигнала на сообщения в этом случае, так что вы можете прервать обработку, если клиент неожиданно отключается, прежде чем начать передачу данных.)

Поэтому убедитесь, что вы называете soup_server_pause_message в callback вы переходите на soup_server_add_handler, а затем, когда вы закончите обработку запроса в своем потоковом вызове soup_server_unpause_message.

Вместо того, чтобы создавать новый поток для каждого запроса, вы можете подумать об использовании thread pool, но идея почти такая же: просто добавьте задачу в пул вместо создания нового потока.

Смежные вопросы