我想在Libsoup服务器中实现多线程,这样每次客户端请求到来时,都会创建一个新线程来提供该请求。 如何使用Libsoup和GLib库实现这一点?
我当前的服务器主代码是这样的:
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 :(得分:1)
在传递给soup_server_add_handler
的回调中创建一个新线程。 manual explains the rest;相关部分:
默认情况下,libsoup假定您从回调返回时已完全处理完消息,因此它可以开始发送响应。如果您尚未准备好立即发送响应(例如,您必须联系其他服务器,或等待数据库中的数据),则必须在回复之前调用消息上的
soup_server_pause_message
。这会延迟发送回复,直到您致电soup_server_unpause_message
。 (在这种情况下,您还必须连接到消息上的finished
信号,以便在开始发送数据之前客户端意外断开连接时可以中断处理。)
因此,请确保在传递给soup_server_pause_message
的回调中调用soup_server_add_handler
,然后在线程调用soup_server_unpause_message
处理完请求后。
您可能想要考虑使用thread pool而不是为每个请求创建新线程,但这个想法几乎相同 - 只需向池中添加一个任务,而不是创建一个新线程。 / p>