我需要創建一個服務器,爲每個嘗試連接到服務器的客戶端創建一個新的線程。爲每個客戶端創建的新線程管理客戶端,服務器進程偵聽來自端口的新連接。如何創建一個爲每個客戶端創建一個新線程的服務器?
我需要在Unix C中編寫代碼。這是我需要儘快完成的任務的子任務。我對這個領域很陌生,因此對創建服務器知之甚少。
我需要創建一個服務器,爲每個嘗試連接到服務器的客戶端創建一個新的線程。爲每個客戶端創建的新線程管理客戶端,服務器進程偵聽來自端口的新連接。如何創建一個爲每個客戶端創建一個新線程的服務器?
我需要在Unix C中編寫代碼。這是我需要儘快完成的任務的子任務。我對這個領域很陌生,因此對創建服務器知之甚少。
基本上,你正在尋找的東西是這樣的:
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
void* handle_connection(void *arg)
{
int client_sock = *(int*)arg;
/* handle the connection using the socket... */
}
int main(void)
{
/* do the necessary setup, i.e. bind() and listen()... */
int client_sock;
pthread_t client_threadid;
while((client_sock = accept(server_sock, addr, addrlen)) != -1)
{
pthread_create(&client_threadid,NULL,handle_connection,&client_sock);
}
}
這是它創建爲每一個客戶端連接不同的線程服務器應用程序一個漂亮的基本骨架。如果您不知道bind
,listen
或accept
是什麼,請參閱本地手冊的第二部分。
此代碼包含經典競爭條件。除非您要同步訪問它,否則不能將'client_sock'的地址傳遞給新線程。我會使用'(void *)client_sock',但是如果你發現真的很糟糕,你可能會浪費時間和內存來調用'malloc',或者添加一個信號量或其他同步對象(也浪費大量時間)。 – 2012-04-09 16:02:50
謝謝!我想下一次我會堅持使用與裝配無關的問題。 – 2012-04-09 16:15:42
對不起,有點苛刻。然而,當一個新手詢問一個線程問題時,給他們一個包含經典線程初學者錯誤的答案最好是有點麻煩。請注意,使用此答案的人可能永遠不會捕獲競爭條件,因爲'accept'的速度非常緩慢,以至於在主線程覆蓋變量時新線程不會啓動。 – 2012-04-09 16:41:18
首先看看https://computing.llnl.gov/tutorials/pthreads/。這是關於C的線程庫的教程。享受!
發佈一些代碼,以便我們有一些工作。 – cnicutar 2012-04-09 14:04:16
[堆棧溢出不是代碼寫入,教程或諮詢服務](http://meta.stackexchange.com/a/128553/172496) – 2012-04-09 14:05:47
您需要創建一個服務來做到這一點?或者你正在加載一個新的服務器,需要這樣配置它? – Brian 2012-04-09 14:05:53