📄 ser_main.c
字号:
#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include "mymsg.h"void door_create(void (* proc)(),int flag);void door_server_proc1(char *,size_t);void door_server_proc2(char *,size_t);key_t fattach(char *,int);int door_return(char *,size_t);int ltos(char*,long,int);static int door_msg_id1=-1;static int door_msg_id2=-1;key_t key_id1, key_id2;message *rcv_msg1,*rcv_msg2, *snd_msg1,*snd_msg2;int rcv_len1,rcv_len2, snd_len1,snd_len2;char *result;int main(int argc,char **argv){ if (argc != 4) { error_quit("usage: server <server_pathname1> <server_pathname1> "); exit (1); } door_msg_id1 = fattach(argv[1],IPC_CREAT|0666); door_msg_id1 = fattach(argv[2],IPC_CREAT|0666); while (1) { door_create(door_server_proc1,door_msg_id1); door_create(door_server_proc2,door_msg_id2); } exit (0);}void door_create(void (* proc)(char * ptr,size_t data_size),int flag){ int data_len, rcv_len, n; char str[16]; printf("\n----waiting for receive client request----\n"); rcv_msg = (message *)malloc(MAXSIZE); rcv_len = msgrcv(flag,rcv_msg,MAXSIZE+2*sizeof(long),CLIENT_INPUT,0); if (rcv_len == -1) { error_quit("!!!receive client request error!!!"); continue; } data_len = rcv_len - sizeof(long); strncpy(str,rcv_msg->m_buf,data_len); str[data_len] = '\0'; (*proc)(str,data_len); free(rcv_msg);}//computing squarevoid door_server_proc1(char *ptr,size_t data_size){ int n; long result; char lptr[20]; n = atoi(ptr); result = n*n; ltos(lptr,result,20); door_return(lptr,strlen(lptr));}//computing max_stringvoid door_server_proc2(char *ptr,size_t data_size){ int n; char *re1, re2[MAXSIZE], result[MAXSIZE]; re1 = strstr(ptr,'+'); n = strlen(ptr)-strlen(re1); strncpy(re2,ptr,n); re2[n] ='\0'; ++re1; re1[str(re1)+1] ='\0'; if (strcmp(re1,re2) > 0) strcpy(result,re1); else strcpy(result,re2); door_return(result,strlen(result));}int door_return(char *ptr,size_t data_size){ int ret; int size; size = 2*sizeof(long) + data_size + 1; ptr[data_size] = '\0'; snd_msg = (message *)malloc(MAXSIZE); snd_msg->m_type = rcv_msg->process_id; snd_msg->process_id = getpid(); strcpy(snd_msg->m_buf,ptr); snd_len = sizeof(snd_msg) - sizeof(long); if ((ret = msgsnd(door_msg_id,snd_msg,snd_len,0)) < 0) { error_quit(" !!!send result to client error!!! "); exit (1); } printf("----send the result to client----\n"); free(snd_msg); return (0);}int fattach(char *pathname,int flag){ int door=-1; key_id = ftok(pathname,'1'); if (key_id == -1) { error_quit("!!!attatch the file to door error,no the file!!! "); return (-1); exit (1); } door_id = msgget(key_id,0); if (door_id!= -1) { if ((n = msgctl(door_id,IPC_RMID,NULL)) == -1) { error_quit("!!!remove old door list error!!!"); exit (1); } } door_id = msgget(key_id,flag); if (door_id == -1) { error_quit("!!!create new door list error!!!"); exit (1); } return (door_id);}int ltos(char* str,long num,int size){ int i; long temp; temp=num; if(temp==0) { memset(str,'0',size); return 1; } for(i=0;i<size-1;i++) { if(num > 0) { str[size-2-i] = num % 10 + '0'; num /= 10; } else str[size-2-i] =' '; } str[size-1] = '\0'; return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -