head.h:
1 /* head */ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <sys/types.h> 7 #include <fcntl.h> 8 #include <signal.h> 9 #include <sys/stat.h> 10 11 #define SERVER_FIFO "/tmp/server_fifo" 12 #define LOGIN 0 13 #define SEND 1 14 15 typedef struct 16 { 17 int service_type; 18 char myfifo[50]; 19 20 union { 21 struct { 22 char username[50]; 23 }user ; 24 struct { 25 char name_src[50]; 26 char name_dst[50]; 27 char msg[100]; 28 }msg; 29 } choose; 30 }Message; 31 32 typedef struct { 33 char name[50]; 34 char fifo[50]; 35 }User;
server.c
1 #include "head.h" 2 #define BUF_SIZE 100 3 4 int ser_fifo; 5 int i; 6 int fd; 7 int user_num ; 8 char buffer[BUF_SIZE]; 9 Message message; 10 User users[10]; 11 12 void init(){ 13 if(access(SERVER_FIFO, F_OK) == -1){ 14 if(mkfifo(SERVER_FIFO, 0777) == -1){ 15 perror("init-access-mkfifo"); 16 exit(1); 17 } 18 } 19 20 if((ser_fifo = open(SERVER_FIFO, O_RDONLY | O_NONBLOCK)) == -1){ 21 perror("init-open"); 22 exit(1); 23 } 24 } 25 26 27 void sendBuffer(){ 28 29 if((fd = open(message.myfifo, O_WRONLY | O_NONBLOCK)) == -1){ 30 perror("sendBuffer-open"); 31 exit(1); 32 } 33 if(write(fd, buffer, strlen(buffer)+1) == -1){ 34 perror("serndBuffer-write"); 35 } 36 close(fd); 37 } 38 39 void login(){ 40 for (i = 0; i < user_num; ++i) 41 { 42 if(strcmp(message.choose.user.username, users[i].name) == 0){ 43 strcpy(buffer,"1,the user has existed"); 44 break; 45 } 46 } 47 48 if(i == user_num) 49 strcpy(buffer ,"0,login success"); 50 strcpy(users[user_num].name, message.choose.user.username); 51 strcpy(users[user_num++].fifo, message.myfifo); 52 53 sendBuffer(); 54 } 55 56 void send(){ 57 for (i = 0; i < user_num; ++i) 58 { 59 if(strcmp(message.choose.msg.name_dst, users[i].name) == 0) 60 break; 61 } 62 if(i == user_num) 63 strcpy(buffer, "the user is not exist! i=user_num"); 64 else{ 65 if((fd = open(users[i].fifo, O_WRONLY | O_NONBLOCK)) == -1){ 66 perror("send-open"); 67 exit(1); 68 } 69 sprintf(buffer, "from %s: %s\n", message.choose.msg.name_src,message.choose.msg.msg); 70 if(write(fd, buffer, BUF_SIZE) == -1){ 71 perror("send-write"); 72 exit(1); 73 } 74 close(fd); 75 strcpy(buffer, "send success !!"); 76 } 77 sendBuffer(); 78 } 79 80 void operation(int type){ 81 if(type == LOGIN) login(); 82 else if(type == SEND) send(); 83 } 84 85 int main(int argc, char const *argv[]) 86 { 87 init(); 88 while(1){ 89 if((read(ser_fifo, &message, sizeof(Message) + 50))>0){ 90 operation(message.service_type); 91 } 92 } 93 return 0; 94 }
client.c:
1 #include "head.h" 2 #define BUF_SIZE 100 3 char mypipename[100]; 4 char myname[50]; 5 char buffer[BUF_SIZE]; 6 int ser_fifo; 7 int my_fifo; 8 Message message; 9 10 11 void init(){ 12 if(access(SERVER_FIFO, F_OK) == -1){ 13 perror("init-access"); 14 exit(1); 15 } 16 17 ser_fifo = open(SERVER_FIFO, O_WRONLY); 18 if(ser_fifo == -1){ 19 perror("init-open"); 20 exit(1); 21 } 22 23 sprintf(mypipename, "/tmp/client%d_fifo", getpid()); 24 // printf("%s",mypipename); 25 if(mkfifo(mypipename, 0777) == -1){ 26 perror("init-mkfifo"); 27 exit(1); 28 } 29 30 my_fifo = open(mypipename, O_RDONLY | O_NONBLOCK); 31 if(my_fifo == -1){ 32 perror("open my fifo"); 33 exit(1); 34 } 35 36 strcpy(message.myfifo, mypipename); 37 } 38 39 void sendMessage(){ 40 if(write(ser_fifo, &message, sizeof(Message)) == -1){ 41 perror("sendMessage-write"); 42 exit(1); 43 } 44 } 45 46 recMessage(){ 47 int res; 48 if((res = read(my_fifo, buffer, BUF_SIZE)) == -1){ 49 perror("recMessage-read"); 50 exit(1); 51 } 52 return res; 53 } 54 55 int login(){ 56 message.service_type = LOGIN; 57 printf("username: "); 58 scanf("%s", message.choose.user.username); 59 sendMessage(); 60 while(recMessage() == 0) ; 61 printf("%s\n", buffer); 62 if(buffer[0] == '0'){ 63 strcpy(myname, message.choose.user.username); 64 return 0; 65 } 66 return -1; 67 } 68 69 void send(){ 70 message.service_type = SEND; 71 printf("message to : "); 72 scanf("%s", message.choose.msg.name_dst); 73 printf("The message is :\n"); 74 getchar(); 75 fgets(message.choose.msg.msg, 100, stdin); 76 strcpy(message.choose.msg.name_src, myname); 77 sendMessage(); 78 } 79 80 int main(int argc, char const *argv[]) 81 { 82 init(); 83 while(login()!= 0); 84 int pid; 85 if((pid = fork()) == -1){ 86 perror("main-fork"); 87 exit(1); 88 } 89 90 if(pid == 0){ 91 while(1){ 92 if(recMessage() > 0) 93 printf("%s\n", buffer); 94 } 95 } 96 else{ 97 while(1){ 98 sleep(1); 99 send(); 100 } 101 } 102 return 0; 103 }