①先建立乙個sever_fifo檔案 用於接收來自不同客戶端的資料,所有客戶端的資料都會傳送至這個檔案,經過處理後再轉存到別的檔案之後才會傳送到另乙個客戶端上。
②利用結構體傳輸過來客戶端的pid,並將pid存在pid【】陣列中,pid的值是用來區分將資訊回傳的依據。
③通過簡單的pid區分傳來的結構體中的資料應該回傳的檔案,並將資料寫入該檔案。不停的重複此步驟。
2、客戶端
①根據自己的pid建立fifo檔案。
②用fork建立程序,父程序用於輸入聊天的內容,子程序用於接收根據自己pid建立的fifo中的資料,一旦資料有改變,立即輸出到螢幕上。
以下是伺服器端的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define server_fifo_name "serv_fifo"
#define client_fifo_name "client_fifo_%d"
//----------------------
#define bufsize 200
struct data_to_pass;
int main();
struct data_to_pass my_data;
int read_res;
char client_fifo[256];
char *char_ptr;
mkfifo(server_fifo_name,0777);
/server_fifo_fd = open(server_fifo_name , o_rdonly);
if( -1 == server_fifo_fd )
//從管道中讀取資料。
read_res = read ( server_fifo_fd , &my_data , sizeof(my_data));
printf("%d\n",my_data.client_pid);
pid[0]=my_data.client_pid;
while(pid[1]==0)
//從管道中讀取資料。
read_res = read ( server_fifo_fd , &my_data , sizeof(my_data));
printf("%d\n",my_data.client_pid);
if(pid[0]!=my_data.client_pid)
pid[1]=my_data.client_pid;}//
again: //用goto去實現迴圈監聽請求.
//開啟伺服器端口,等待讀取。此時如果客戶端還未寫入資料伺服器端會被阻塞。
server_fifo_fd = open(server_fifo_name , o_rdonly);
if( -1 == server_fifo_fd )
//從管道中讀取資料。
read_res = read ( server_fifo_fd , &my_data , sizeof(my_data));
printf("%d\n",my_data.client_pid);
if(pid[0]==my_data.client_pid) my_data.client_pid=pid[1];
else if(pid[1]==my_data.client_pid) my_data.client_pid=pid[0];
if(read_res > 0)
}close(server_fifo_fd);
goto again;
unlink(server_fifo_name);
exit(exit_success);}
以下是客戶端的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define server_fifo_name "serv_fifo"
#define client_fifo_name "client_fifo_%d"
#define bufsize 200
struct data_to_pass;
int main()
//獲得當前程序pid存入結構中。
mydata.client_pid = getpid();
sprintf ( client_fifo,client_fifo_name,mydata.client_pid);
mkfifo(client_fifo,0777);
write(server_fifo_fd , &mydata , sizeof(mydata));
pid=fork();
if(pid<0)
again:
if(pid>0)//父程序
else if(pid==0)//子程序
close(client_fifo_fd);}}
goto again;
close(server_fifo_fd);
unlink(client_fifo);
exit(exit_success);
}
win7下實現利用命名管道實現網路通訊
在看教材的時候大家都知道利用命名管道可以實現網路通訊,在win7上做了次實驗,卻發現困難重重,所幸的是最後搞成功了,但是不推薦像我這樣做。我用的 就是msdn上的範例服務端 客戶端是 測試環境 服務端在win7,客戶端是win2003 第一 要開啟win7的guest賬戶。第二 可能要關掉防火牆。第...
利用命名管道實現程序之間的通訊
命名管道不僅可以實現 本地程序之間的通訊還可以實現網路程序的通訊 與油槽不同的是 管道式基於面向連線的可靠的通訊 只能一對一傳輸 資料 我們可以通過 createnamedpipe 建立乙個管道 可以指定模式是雙向 即客戶端 和服務端都可以進行讀寫 管道 就跟基於 socket的tcp通訊類似 在服...
程序間通訊(三) 利用命名管道
程序間通訊 三 利用命名管道 程序間通訊的四種方式 1 剪貼簿 2 匿名管道 3 命名管道 4 郵槽 命名管道是通過網路來完成程序間的通訊,它遮蔽了底層的網路協議細節。我們在不了解網路協議的情況下,也可以利用命名管道來實現程序間的通訊。將命名管道作為一種網路程式設計方案時,它實際上建立了乙個客戶機 ...