Linux fifo實現服務,端客戶端的雙向通訊

2021-08-18 11:47:36 字數 3346 閱讀 2146

fifo的使用

簡單介紹下**的執行過程,簡單說類似qq的收發訊息,隨時可寫,隨時可讀,

寫入eof會終止傳送方的寫,接收方的讀

讀取eof會終止接收方的讀,接收方還可以繼續寫

執行截圖:

這用到了pipe建立子程序,

服務端子程序用於讀,有可讀訊息便顯示,父程序用於傳送,有輸入訊息便傳送

客戶端子程序用於寫,有輸入訊息便傳送,父程序用於讀,有可讀訊息便顯示

1.首先建立服務端server.c

要知道linux中無法實現管道的雙向通訊,所以既然要建立雙向通訊,則一定要建立兩個管道,乙個用於父程序寫,子程序讀;乙個用於子程序寫,父程序讀

其次fifo是建立了本地檔案,所以要檢查檔案的存在性,使用access,access函式講解

不可以使用unink(file)刪除檔案,存在開啟管道,不存在建立

#define

server_w

"serverwrite"

#define

server_r

"serverread"

以下是服務端的檢查**,服務端的讀管道用於客戶端的寫管道,服務端的寫管道用於客戶端的讀管道

//首先要檢查檔案的存在性

//access 存在返回0,不存在返回-1

//寫管道

if(access(server_w,

0) <

0)printf(

"管道%s建立成功

\n",server_w); }

//存在則開啟管道

fd_w =

open(server_w,o_rdwr);

if(fd_w <

0)printf(

"開啟寫管道

\n");

//讀管道

if(access(server_r,

0) <

0)printf(

"管道%s建立成功

\n",server_r); }

//存在則開啟

fd_r =

open(server_r,o_rdwr);

if(fd_r <

0)printf(

"開啟讀管道

\n");

2.服務端和客戶端的程序建立

pid =

fork();

if(pid <

0)else

if(pid ==

0)else

3.通訊部分

(1)服務端子程序讀

while(

1)else }

else

printf(

"服務端讀取訊息完成

\n\n

"); }

}//while

(2)服務端父程序寫

while(

1)else }

}//while

4.客戶端,和服務端類似,只是**的轉移替換

原碼:服務端:

#include #include #include #include #include #include #include #include #define server_w "serverwrite"

#define server_r "serverread"

void main()

printf("管道%s建立成功\n",server_w);

}//存在則開啟管道

fd_w = open(server_w,o_rdwr);

if(fd_w < 0)

printf("開啟寫管道\n");

//讀管道

if(access(server_r,0) < 0)

printf("管道%s建立成功\n",server_r);

}//存在則開啟

fd_r = open(server_r,o_rdwr);

if(fd_r < 0)

printf("開啟讀管道\n");

printf("服務端開始通訊\n");

pid = fork();

if(pid < 0)else if(pid == 0)else

}else

printf("服務端讀取訊息完成\n\n");

}}//while

_exit(0);

}elseelse

}}//while

wait(null);

}//關閉檔案

close(fd_w);

printf("關閉寫管道\n");

close(fd_r);

printf("關閉讀管道\n");

printf("程式結束\n");

return;

}

客戶端:

#include #include #include #include #include #include #include #include #define server_w "serverwrite"

#define server_r "serverread"

void main()

printf("管道%s建立成功\n",server_w);

}//存在則開啟

fd_r = open(server_w,o_rdwr);

if(fd_r < 0)

printf("開啟讀管道\n");

//寫管道

if(access(server_r,0) < 0)

printf("管道%s建立成功\n",server_r);

}//存在則開啟管道

fd_w = open(server_r,o_rdwr);

if(fd_w < 0)

printf("開啟寫管道\n");

printf("客戶端開始通訊\n");

pid = fork();

if(pid < 0)else if(pid == 0)else

}}//while

_exit(0);

}elseelse

}else

printf("客戶端讀取訊息完成\n\n");

}}//while

wait(null);

}//關閉檔案

close(fd_w);

printf("關閉讀管道\n");

close(fd_r);

printf("關閉寫管道\n");

printf("程式結束\n");

return;

}

TeamTalk服務端分析之服務端以及客戶端流程

原文 www.bluefoxah.org teamtalk server flow.html 服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動 也不是唯一的順序 1 啟動db proxy。2 啟動route se...

TeamTalk服務端分析之服務端以及客戶端流程

分類 teamtalk 服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動 也不是唯一的順序 1 啟動db proxy。2 啟動route server,file server,msfs 3 啟動login ser...

Linux 下C 實現socket服務端和客戶端

server.cpp include include include include include include include include using namespace std 埠號 const int port 8080 socket緩衝佇列大小 const int queue siz...