⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ser_main.c

📁 lpc implement for distribut
💻 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 + -