2014-12-03 146 views
1

我正在嘗試用C語言創建一個類似於網絡郵件的客戶端服務器程序。事情是,我已經設法將我的服務器連接到客戶端並使其正常工作,但是現在我想引入另一臺服務器並創建一個三元組:客戶端連接到一臺服務器,請求某些內容,如果該請求可以「服務器1通過套接字將其發送到服務器2,以查看該服務器是否可以遵守。 我開始在服務器1中創建兩個套接字 - 一個用於客戶端,另一個用於服務器2,具有相同的基本代碼,因此它可以偵聽一個端口到客戶端,另一個端口偵聽服務器2,但事實證明'accept'函數被阻塞,所以一旦連接到客戶端,它就不會移動,除非服務器2說出來。客戶端服務器程序,兩臺服務器

不知道我是否足夠清楚,但任何建議,將不勝感激。

謝謝

+0

請張貼一些代碼!你有沒有嘗試把第二個插座放在不同的線程中? – 2014-12-03 14:59:54

+0

我不認爲你可以在C中啓動「線程」。它可能是套接字是以'exec'或類似的並行進程啓動的。但是,這是O/S級別的多任務處理。 – 2014-12-03 15:09:12

+0

關於我以前的評論,我把它收回...沒有意識到pthread的東西(http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html)。對不起,如果我困惑任何人。 – 2014-12-03 15:23:48

回答

2

如果你想避免堵塞,我會建議你將使用select接受。 它基本上等待(超時)的套接字,直到它有連接,然後才運行接受。

你可以找到my sockets programming guide

1

一些示例代碼,您有幾種選擇,做你想做什麼:

  1. 基本多線程:啓動第二個線程,連接到線程2服務器,並使用阻塞隊列或者線程之間的通信類似的東西。

  2. 正如Idan所說:使用I/O複用。 select()是最容易使用的imo,它可以很好地擴展到〜1000個連接,據我所知。

  3. 拆分架構中的邏輯以提供一臺服務器,該服務器用於獲取數據並在單獨的進程(甚至是機器)中運行其他服務器(客戶端不可見)來存儲數據。在這種情況下,第一臺服務器並行或按順序查詢其他服務器的數據。我建議你制定一個在這種情況下在服務器之間分發數據的策略,以加快查詢速度。