有名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...