2010-09-14 149 views
2

我想寫一個聊天服務器在C,允許使用POSIX套接字的兩個客戶端之間的通信。我不確定我對這個概念有很好的把握,或者我應該如何在客戶端和服務器之間建立通信協議。聊天服務器與C插座

我知道我需要一個套接字到bind()服務器端口,以便我可以接受來自客戶端的傳入連接,但爲了讓兩個客戶端同時連接,是否需要爲每個客戶端創建一個套接字我accept()或應該我accept()一個客戶端,然後fork()所以我可以讓另一個客戶端接受?我並不擔心同時聊天,它更像是一種乒乓方式,客戶需要在send()之後等待recv(),然後才能鍵入新消息。

回答

4

您有兩種處理多個客戶端的方法:使用非阻塞IO和使用線程。對於聊天等小事我寧願使用非阻塞,因爲我不必擔心鎖和線程。檢查selectpoll函數。

主循環會做這樣的事情:

  1. 建立一套與所有你想要聽
  2. 等待的FD對select返回
  3. 使用FD_ISSET檢查傳入連接您的主要的fd(你傳遞給你聽的那個)。然後你可以accept()並將新的fd保存在連接列表中。
  4. 處理您感興趣的其他fd(使用FD_ISSET循環查看活動套接字)。
2

當您爲accept返回該客戶端的新套接字時,您可以在該點生成一個線程來處理該客戶端。在該線程中,您可以將recvsend添加到新返回的套接字中以與您連接的客戶端通信。

您應該繼續使用以前的套接字accept

你定義的協議應該規定誰按照什麼順序發送消息。

0

當您一次使用多個套接字(即在三方聊天中)時,處理套接字的最簡單方法是在select()或poll()內部進行阻塞,只要數據在至少一個插座上可用。然後可以使用FD_ISSET()來確定哪些套接字有數據準備好讀取,並在它們上調用recv()。