好的,這裏是情況。 我需要使用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,如果沒有找到,創建一個管,分叉並完成結構(並將其添加到列表中)。
服務器是否爲每個客戶端產生了一個子程序,或者是所有客戶端只有一個子項?什麼是數據流?我理解你所問的大部分內容,但細節還不是很清楚。 –
每個客戶端一個孩子(孩子讓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}管; 我還沒有放棄這種可能性,但我不知道它會工作,我相信它不是很漂亮 –