国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用fifo管道實現多人聊天

2019-11-08 02:51:20
字體:
來源:轉載
供稿:網友

用fifo管道實現多人聊天

最近學習了多路IO,多線程,信號注冊函數,管道通信等內容。于是通過以上技術,寫了一個通過管道通信的多人聊天小程序。程序還存在很多不足,但是勉強能實現需要的功能。先貼上,日后完善。 先介紹程序大致功能,再貼上代碼: 1.啟動服務器程序,用epoll進行監聽客戶端事件發生,同時創建一個文件寫入服務器端的pid,用于客戶端信號發送到服務器. 2.再啟動客戶端程序,創建讀寫管道。同時發送信號到服務器,以便讓服務器連接管道。 3.連接成功后進行通信 setname xxx 用于創建用戶名 to xxx:buf 給指定xxx用戶發送buf消息 to all:buf 給所有用戶發送buf消息

服務端程序:

#include<stdio.h>#include<errno.h>#include<signal.h>#include<sys/epoll.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<string>#include<map>#include<iostream>using namespace std;typedef struct chat_user_t{//客戶信息結構體 string name; int fd_read; int fd_write;}chat_user_t;map<string,chat_user_t*> users;//保存客戶信息int epollfd;const char* errmsg[] = {//出錯信息 "ok", "user not exit", "unknown command"};//創建文件存儲服務器進程idvoid create_pid_file(char* filename){ char buf[1024]; s客戶端程序#include <stdio.h>#include <signal.h>#include <pthread.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include <errno.h>#include <unistd.h>#include <string.h>#include <unistd.h>#include <stdlib.h>pid_t get_server_pid(){ int fd = open("myserver.run", O_RDWR); char buf[1024]; read(fd, buf, sizeof(buf)); close(fd); return (pid_t)atoi(buf);}// 等待服務器發送數據void* thread_recv(void* ptr){ int fd_read = (int)(intptr_t)ptr; char buf[4096]; while(1) { int ret = read(fd_read, buf, sizeof(buf)); if(ret == 0) // 寫端已經被關閉了 { exit(0); // 整個進程退出 } if(ret < 0) { if(errno == EINTR) // 讀文件失敗 continue; exit(0); // 讀文件錯誤 } printf("%s/n", buf); // 要求buf不帶 }}int main(){ // 創建兩個管道文件 pid_t pid = getpid(); char buf1[4096]; sprintf(buf1, "%d-1", (int)pid); mkfifo(buf1, 0777); char buf2[4096]; sprintf(buf2, "%d-2", (int)pid); mkfifo(buf2, 0777); // 發送信號給服務器,我來了 pid = get_server_pid();// printf("%d/n",(int)pid); // 發送信號告訴服務器,新的客戶端加入 union sigval v; sigqueue(pid, SIGRTMIN, v); // 打開管道文件,一定在發送信號之后 // 讓客戶端和服務器一起打開管道,否則會阻塞 int fd_write = open(buf1, O_WRONLY); int fd_read = open(buf2, O_RDONLY); // 創建一個線程,負責信息的接收 pthread_t tid; pthread_create(&tid, NULL, thread_recv, (void*)(intptr_t)fd_read); // 等待用戶輸入 while(1) { char buf[4096]; fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1] = 0; if(strlen(buf) == 0) // 空敲回車的處理 continue; // setname xue // to yy: hello yy write(fd_write, buf, strlen(buf)+1); // 帶上/0 }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 介休市| 岐山县| 长泰县| 邓州市| 如皋市| 汉阴县| 大丰市| 汽车| 中阳县| 黄浦区| SHOW| 昌吉市| 乌兰察布市| 翁源县| 远安县| 土默特左旗| 金华市| 福清市| 丰顺县| 东兴市| 玛曲县| 安丘市| 青河县| 赣榆县| 绍兴县| 普兰店市| 沅陵县| 宁远县| 如东县| 津南区| 建昌县| 响水县| 金沙县| 鹤峰县| 慈溪市| 丘北县| 舞钢市| 礼泉县| 梧州市| 磐石市| 台东县|