我想在C中使用Pthreads設計一個多線程的Web服務器,並且我在接受更多傳入連接時沒有提供服務時遇到問題。如何將套接字文件描述符放入緩衝區並繼續接受傳入連接?
我想把每個接收到的連接的文件描述符放入一個緩衝區以供線程處理,我使用默認接受(2)來接受客戶端連接。
我應該使用select?任何建議?
我想在C中使用Pthreads設計一個多線程的Web服務器,並且我在接受更多傳入連接時沒有提供服務時遇到問題。如何將套接字文件描述符放入緩衝區並繼續接受傳入連接?
我想把每個接收到的連接的文件描述符放入一個緩衝區以供線程處理,我使用默認接受(2)來接受客戶端連接。
我應該使用select?任何建議?
做多線程服務器的常見方法是創建一個新的線程,你接受一個新的連接之後,和將新套接字傳遞給該線程。類似這樣的:
int main(int argc, char *argv[])
{
/* ... */
int client_socket = accept(server_socket);
pthread_create(&thread, NULL, my_connection_handler, (void *) client_socket);
/* ... */
}
void *my_connection_handler(void *argp)
{
int socket = (int) argp;
write(socket, "Hello!\r\n", 8);
close(socket);
return NULL;
}
只是要警告,雖然這是最簡單的方法和你通常應該首先學習的方式,但表現很糟糕。您必須創建一個新線程並等待它獲取CPU,然後才能開始服務新連接。更糟糕的是,要在每個100個連接上做一點點工作,需要100個上下文切換。另外,如果線程結束訪問常用數據結構,則會在這些數據結構上獲得同步的不良行爲。 – 2012-03-23 17:49:17
@DavidSchwartz因此,如果我使用固定大小的工作線程池,並使用互斥鎖或信號量同步共享內存,它會在有人傳遞給工作線程時開始接收連接嗎? – CodeRed 2012-03-23 19:06:04
@CodeRed:這是一個常用的方法。由於我之前解釋過的許多原因,它仍然不是很好 - 它需要大量的上下文切換和大量的線程(每個客戶端一個)會使同步效率低下。 (例如,大量數據進來,每個80個客戶端都有一點點,所以所有80個線程都會喚醒,只能在同一個同步對象上進行阻塞,而每個80個線程都會反過來。上下文切換無緣無故。) – 2012-03-23 20:04:10
我最近幾天看過這篇文章(我沒有嘗試,但看起來不錯): http://www.linuxjournal.com/content/network-programming-enet 或libevent了。
如果您通過自己的雙手想要的代碼,看看(性能想法): http://www.kegel.com/c10k.html
您是否在尋找簡單的編碼或高性能?你想自己做還是使用圖書館?如果你關心性能,你需要高吞吐量還是高數量的連接? – 2012-03-23 04:06:13
@DavidSchwartz它更好地使用庫和簡單的編碼,因爲它只是設計的一部分,我只會測試連接的數量。 – CodeRed 2012-03-23 04:11:34
然後看看Boost :: asio或libevent。 – 2012-03-23 04:24:20