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