使用fifo實現乙個伺服器端多個客戶端通訊

2021-07-28 11:40:15 字數 1594 閱讀 3913

有名fifo預設是阻塞讀,阻塞寫的,如果要設定阻塞屬性,可以再open()的時候進行設定

在阻塞情況下:實現伺服器端可以不斷讀取客戶端寫到管道裡面的檔案流

這個裡面有個重要的問題時,如果使用伺服器端進行read(),讀的buf的大小是多少呢?如果每乙個客戶端每次傳過來的buf大小都不一樣,那麼伺服器端使用read函式必然會造成資料讀取不完整或者超出實際寫進去的,這是因為,對於多個程序都在向fifo檔案中寫時,乙個程序乙個程序將要寫的內容寫進去,如果在讀buf大小的資料的時候,有兩個程序一前一後寫入資料(在下次read()之前),那麼這兩個程序的寫入資料就會混亂的讀入讀程序。

為了解決這一問題:

關鍵:統一buf的大小,也就是write read函式每次操作的buf的大小都是確定的,這樣的話,每乙個程序的資料就有了「原子性」,被封裝在乙個buf中,保證每一次讀,都是乙個完整的資料報

比如:客戶端有登入包,傳送資訊給其他客戶端的資訊包等等,將不同包的內容封裝,這裡就像乙個協議,不同的資料報有不同的編號,比如,登入包,編號為1,資訊包編號為2,這樣,講將要傳遞的內容拼接在一起,作為長度固定的整體,如果長度不夠,填充特殊字元,就像ip資料報一樣,這樣,按照不同編號,伺服器也對應了不同的解析buf的方法,這樣就保證多個程序的資料可以完整的傳遞到伺服器端了

**:client_0

#include

#include

#include

#include

#include

#include

#include

#define buf_size 1024

void sys_err(char *errmes,int errno)

int main(int argc ,char **argv)

if((fd=open(argv[1],o_wronly))<0)

while(1)

close(fd);

return 0;}

server.c

int main(int argc ,char **argv)

//建立乙個fifo

//先判斷該檔案是否存在,如果不存在再建立,存在就不建立了

if(access(argv[1],f_ok)==-1)

}//開啟該fifo

if((fd=open(argv[1],o_rdonly))<0)

//註冊訊號

signal(sigchld,sig_child);

//從fifo迴圈接收傳遞進來的資料

while(1)else

sleep(1);

}close(fd);

return 0;}

上面的兩段**,只是簡單的表示了一下文字的**形式,關於實際的協議定義,還需要推敲,並且buf的大小也要根據協議而定;對於不同的

協議,有不同的拼接填充方式以及解析方式,**中只是簡單實現了

1.使用mkfifo()函式新建乙個fifo檔案

2.使用open()開啟函式開啟該檔案(可設定阻塞屬性)

3.向檔案中讀寫

ps:如果只有乙個讀端,並且先關閉讀端的話,寫端將程序也將結束

如果先沒有fifo讀端,無法執行fifo寫端(這裡還不是很清楚)

乙個多播例子的伺服器端與客戶端

下面是乙個多播伺服器的例子。多播伺服器的程式設計很簡單,建立乙個資料報套接字,選定多播的ip位址和埠,直接向此多播位址傳送資料就可以了。多播伺服器的程式設計,不需要伺服器加入多播組,可以直接向某個多播組傳送資料。下面的例子持續向多播ip位址 224.0.0.88 的8888埠傳送資料 broadca...

伺服器端使用Screen

如果你在linux伺服器端工作,沒有聽說過screen或tmux那簡直弱爆了。有時間自己可以多了解一些。簡單介紹下screen screen是乙個可以在多個程序之間多路復用乙個物理終端的視窗管理器。screen中有會話的概念,使用者可以在乙個screen會話中建立多個screen視窗,在每乙個scr...

24 實現http伺服器端

1.http hypertext transfer protocol超文字傳輸協議。超文字是可以根據客戶端請求而跳轉的結構化資訊。http協議是以超文字傳輸為目的而設計的應用層協議,是基於tcp ip實現的協議,實現該協議就相當於實現了web伺服器端。2.http協議又稱為無狀態的stateless...