Linux下利用命名管道實現簡單的聊天室

2021-07-22 23:08:04 字數 2757 閱讀 3705

①先建立乙個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 郵槽 命名管道是通過網路來完成程序間的通訊,它遮蔽了底層的網路協議細節。我們在不了解網路協議的情況下,也可以利用命名管道來實現程序間的通訊。將命名管道作為一種網路程式設計方案時,它實際上建立了乙個客戶機 ...