麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

用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 }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九九热免费视频在线观看 | 依人在线视频 | 国产精品久久久久av | 大逼逼影院 | 黄色大片在线免费看 | 99riav视频一区二区 | 成人在线视频精品 | 日本在线视频免费观看 | av中文一区| 污污的视频在线观看 | 国产精品成人一区 | xvideos korean| 免费的性爱视频 | 日本精品网 | 久久久一区二区三区四区 | 一级做a爱片久久毛片a高清 | 免费a级观看 | 黄色片免费在线 | 99精品视频久久精品视频 | 成人免费福利 | 欧美成人做爰高潮片免费视频 | chinese xvideos gay| 在线看小早川怜子av | 91色一区二区三区 | 久久99精品视频在线观看 | 亚洲一级片免费观看 | 思思久而久而蕉人 | 18欧美性xxxx极品hd | fc2成人免费人成在线观看播放 | 欧美羞羞视频 | 婷婷亚洲一区二区三区 | 五月婷婷第四色 | 成人免费av在线 | www.91成人 | 亚洲精华液久久含羞草 | 国产精品看片 | 精品久久久久久久久久久aⅴ | 欧美第1页 | 亚洲男人一区 | 久久亚洲成人网 | 91美女视频在线 |