2012-05-15 86 views
0

我目前正在C語言中做客戶端/服務器應用程序,通過互聯網。服務器將不斷監聽來自客戶端的新連接。目前我正在監聽客戶端,但是一旦客戶端連接,服務器將不會繼續監聽更多客戶端。下圖描述了服務器端的代碼與一個客戶端連接:客戶機/服務器C連接

int sockfd = socket(AF_INET, SOCK_STREAM, 0); 

struct sockaddr_in sockaddr, cliaddr; 
bzero(&sockaddr, sizeof(struct sockaddr_in)); 
bzero(&cliaddr, sizeof(struct sockaddr_in)); 

    sockaddr.sin_family = AF_INET; 
    sockaddr.sin_addr.s_addr = INADDR_ANY; 
    sockaddr.sin_port = ntohs(atoi(argv[1])); 

if(bind(sockfd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) <0) { 
    printf("error binding socket: %d\n", errno); 
    exit(1); 
} 

printf("binded to %d : %d\n", sockaddr.sin_addr.s_addr, htons(sockaddr.sin_port)); 

listen(sockfd,5); 
socklen_t clilen = sizeof(cliaddr); 
int newsockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen); 
    if (newsockfd < 0) 
     error("ERROR on accept"); 

printf("server connected to %d:%d\n", cliaddr.sin_addr.s_addr, htons(cliaddr.sin_port)); 

我假設我要創建某種形式一旦連接已經建立,將叉線程。但我不知道如何實現它..

任何幫助是極大的讚賞

回答

3

下列幾點可能會幫助:

  1. 你應該有你在一個循環中調用接受,所以,接受一個連接之後,它可以再次返回來接受更多的連接。
  2. 要分別處理每個連接,可以使用pthread_create or some similar thread creation APIs創建線程。
  3. 您可以選擇使用Non-Blocking sockets,使用它您可以輕鬆地在同一個線程中處理多個連接。
+0

感謝您的回覆...將在您指出的以下幾點上查找更多 – user1317277

1

您可以通過下面這本書來學習和了解如何在C中開發併發服務器。很難用例子來解釋在回答中編寫併發服務器的各種方法。本書中示例的源代碼是可下載的,所以即使沒有本書(您可以在相同的URL中找到),也可以嘗試它們。研究代碼,你會看到事情是如何工作的。

UNIX Network Programming, Volume 1, Second Edition: Networking APIs: Sockets and XTI

這本書涵蓋了幾乎所有你想知道關於socket編程的事情。

+0

感謝隊友的幫助 – user1317277

+0

歡迎您。如果你需要討論與UNIX系統/網絡編程相關的東西,你可以用[email protected]來ping我。我從上述書中學習了網絡編程,現在我對網絡編程有了很好的瞭解,目前我正在爲我的項目的某些特定需求編寫一個Web服務器。如果可能的話,我可以幫助你。 – Ayub