2012-02-03 117 views
2

我需要在C中實現服務器/客戶端代碼。 服務器需要能夠在此時正好接受四個連接。
我不能得到這個工作。我到目前爲止已經完成:
1.創建一個套接字
2.它設置爲非阻塞:fcntl(sock,F_SETFL, O_NONBLOCK);
3.將其綁定
4.聽:listen(sock, 4);具有多個客戶端的客戶端/服務器體系結構

這我不是部分相當確定的是如何接受客戶的連接。我的代碼看起來是這樣的:

while (1) { 
    if ((sockfd = accept(sock, (struct sockaddr *) &client_addr, &client_size)) < 0) { 
      perror("Error\n"); 
    } 
    read(sockfd, &number, sizeof(number)); 
    write(sockfd, &number, sizeof(number)); 
} 

當我執行客戶端和服務器端的代碼,客戶端似乎是寫東西的插座,其服務器從不接收和整個執行塊。 接受來自多個客戶端的連接的正確方法是什麼?

回答

2

一個用於這種服務器的基本工作流程,如果你不希望使用多線程,是這樣的:

  • 創建fd_set文件描述符的觀看閱讀
  • 打開插座
  • 綁定socket到端口上偵聽
  • 開始監聽套接字
  • 添加套接字的文件描述符ŧ ○fd_set
  • 雖然沒有做過
    • 使用select等到套接字準備通過您fd_set具有可用
    • 數據的FDS從
    • 循環讀取如果當前fd是你的監聽套接字,接受一個新的連接
    • 否則,這是一個客戶端fd。從它讀取,也許寫回來。

This page示出上述處理的流程圖。 (向下滾動以獲得非常好的註釋示例。)

This page充滿了select的示例。

+0

非常感謝你的詳細解釋。我得到它的工作,終於! – Maggie 2012-02-04 09:13:08

1

你應該看看select的男人。它會告訴你什麼時候和插座是準備寫/讀

相關問題