linux socket多进程并发服务器

来源:互联网 发布:张爱玲小说 知乎 编辑:程序博客网 时间:2024/06/05 15:26
/***sever***/  #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/select.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define PORT 1234 #define MAXSOCKFD 10 void main() {  int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;  struct sockaddr_in addr;  int addr_len = sizeof(struct sockaddr_in);  fd_set readfds;  char buffer[256];  char msg[ ] ="Welcome to server!";  pid_t pid;  if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)  {   perror("socket");   exit(1);  }  bzero(&addr,sizeof(addr));  addr.sin_family =AF_INET;  addr.sin_port = htons(PORT);  addr.sin_addr.s_addr = htonl(INADDR_ANY);  if(bind(sockfd,&addr,sizeof(addr))<0)  {   perror("connect");   exit(1);  }  if(listen(sockfd,3)<0)  {   perror("listen");   exit(1);  }  while(1)  {   FD_ZERO(&readfds);   if((newsockfd = accept (sockfd,&addr,&addr_len))<0)    {    perror("accept");    continue;    }     if ((pid = fork()) != 0)   {    close(newsockfd);     continue;    }    FD_SET(newsockfd, &readfds);    printf("cnnect from %s\n",inet_ntoa(addr.sin_addr));   printf("pid = %d, ppid = %d\n", getpid(), getppid());   write(newsockfd,msg,sizeof(msg));   while(1)     {      /*描述符无变化,数据将阻塞*/    if (!select(MAXSOCKFD, &readfds, NULL, NULL, 0))    {     continue;    }    if(read(newsockfd,buffer,sizeof(buffer))<=0)    {     printf("connect closed.\n");     close(newsockfd);     break;    }    else    {     printf("From client: %d\n",buffer[0]);     if (write(newsockfd, buffer, strlen(buffer)) < 0)      perror("write");     printf("To client: %d\n\n",buffer[0]);    }      }   } }    /****client****/ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h>  #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #define PORT 1234  #define SERVER_IP "127.0.0.1" main() {  int s;  struct sockaddr_in addr;  char buffer[256];  static int flag = 1;  if((s = socket(AF_INET,SOCK_STREAM,0))<0)  {   perror("socket");   exit(1);  }  /* 填写sockaddr_in结构*/  bzero(&addr,sizeof(addr));  addr.sin_family = AF_INET;  addr.sin_port=htons(PORT);  addr.sin_addr.s_addr = inet_addr(SERVER_IP);  /* 尝试连线*/  if(connect(s,&addr,sizeof(addr))<0)  {   perror("connect");   exit(1);  }  /* 接收由server端传来的信息*/  recv(s,buffer,sizeof(buffer),0);  printf("%s\n",buffer);  while(1)  {   bzero(buffer,sizeof(buffer));   /* 从标准输入设备取得字符串*/   if (flag == 1)   {    read(STDIN_FILENO,buffer,sizeof(buffer));    printf("Insert data:%s\n", buffer);     flag = 0;   }   else     {      read(s,buffer,sizeof(buffer));     printf("From sever: %d\n\n", buffer[0]);     }    /* 将字符串传给server端*/   sleep(2);    buffer[0] += 1;    if(write(s,buffer,sizeof(buffer))<0)   {    perror("send");    exit(1);   }    printf("To sever: %d\n", buffer[0]);    }  }