2015-01-12 325 views
1

好的,這裏是情況。 我需要使用UDP構建客戶端服務器。c - 具有多個客戶端的UDP客戶端服務器

服務器必須運行第三個程序並將其傳遞給客戶端(我已經使用TCP和命名管道完成了這個應用程序,並且我只是將運行第三個程序的孩子的fifo或套接字的文件描述符「 )。

問題進來UDP,我不能DUP插座,因爲它可以被用於多個客戶端(和應用程序必須爲每個客戶端是唯一的),所以我有點stucked。

我在考慮在服務器和孩子之間使用命名管道 (所以客戶端會發送到服務器,服務器在fifo上寫,服務器在fifo上響應,服務器響應客戶端,例如使用客戶端ip作爲fifo名稱,因此可以很容易識別)。

問題是,如果我DUP兒童FIFO中,我將無法關閉並重新打開服務器上(我需要與所接收的每個消息做)先進先出...

有什麼繞過這個方法?我希望保持儘可能簡單。

編輯 好吧,我有點讓它工作(雖然不是很漂亮)。

我做了這樣的流程如下: 客戶端 - >服務器 - >該客戶端管道(如果它不存在,創建一個孩子,並添加該孩子的管道) - >子 - >管 - >服務器 - >客戶端

管結構是這樣的:

typedef struct _pipes{ 
    char ip_client[SIZE_IP]; 
    int fd_read; 
    int fd_write; 
    int child_pid; 
    struct _pipes *next; 
} pipes; 

當一個消息被收到(recvfrom的),I搜索管與該IP,如果沒有找到,創建一個管,分叉並完成結構(並將其添加到列表中)。

+0

服務器是否爲每個客戶端產生了一個子程序,或者是所有客戶端只有一個子項?什麼是數據流?我理解你所問的大部分內容,但細節還不是很清楚。 –

+0

每個客戶端一個孩子(孩子讓dup來替換stdin和stdout,然後執行) 客戶端 - >服務器 - > pipe_for_child-client - >子 - >管道 - >服務器 - >客戶端 我正在嘗試通過管道將每個孩子與服務器連接起來(每個孩子2個管道),爲此我必須創建一個如下列表: \t typedef struct _pipes { \t \t char ip_client [SIZE_IP]; \t \t int fd_read; \t \t int fd_write; \t \t int child_pid; \t \t struct _pipes * next; \t}管; 我還沒有放棄這種可能性,但我不知道它會工作,我相信它不是很漂亮 –

回答

1

你的問題是UDP服務器採用了單插槽與所有客戶進行溝通。它不一定是這樣。例如,您可以擁有一個客戶端可以連接到的單個套接字,但只能使用它來建立一個「會話」,該會話將在服務器創建的新套接字上繼續。

您也可以通過讓服務器使用「發件人」地址(例如,通過recvfrom())區分客戶端,將消息發送到正確的子進程,然後將結果返回給始發客戶(例如通過sendto())。

事實上,你可能必須使用第二個選擇,由於UDP的性質。例如,如果子程序一次寫入超過1500個字節,那麼這將不會適用於單個UDP數據報,因此將被自動截斷。這會很糟糕,所以您可能需要在發送到客戶端之前在服務器中添加邏輯來分段數據。

+0

我正在使用這個功能,問題是將它們作爲標準輸入/出創建的孩子鏈接由服務器(我想通過創建每個客戶端子的管道,通過服務器中的列表連接它們來解決這個問題)。我認爲這可能會起作用。如果是這樣,我編輯答案 –