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

📄 7_processserver.txt

📁 unix环境下的多进程并发服务器源程序。
💻 TXT
字号:
#include <stdio.h>
#include <srtings.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet.h>
#include <arpa/inet.h>
#define PORT 1234
#define BACKLOG 2
#define MAXDATASIZE 1000
void process_cli(int connectfd,sockaddr_in client);
main()
{ int listenfd,connectfd;
  pid_t pid;
  struct sockaddr_in server;
  struct sockaddr_in client;
  int sin_size;
  if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    perror("creating socket failed.");
    exit(1);
  }
  int opt=SO_REUSEADDR;
  setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  bzero(&server,sizeof(server));
  server.sin_family=AF_INET;
  server.sin_port=htons(PORT);
  server.sin_addr.s_addr=htonl(INADDR_ANY);
  if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1){
    perror("bind error.");
    exit(1);
  }
  if(listen(listenfd,BACKLOG)==-1){
    perror("listen() error.\n");
    exit(1);
  }
  sin_size=sizeof(struct sockaddr_in);
  while(1)
  { if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1){
      perror("accept() error\n");
      exit(1);
     }
     if((pid=fork())>0){
       close(connectfd);
       continue;
     }
     else if(pid==0){
       close(listenfd);
       process_cli(connectfd,client);
       exit(0);
     }
     else {
       printf("fork error.\n");
       exit(0);
     }
  }
  close(listenfd);
}
void process_cli(int connectfd,sockaddr_in client)
{ int num;
  char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],cli_name[MAXDATASIZE];
  printf("you got a connection from %s.",inet_ntoa(client,sin_addr));
  num=recv(connectfd,cli_name,MAXDATASIZE,0);
  if(num==0){
    close(connectfd);
    printf("client disconnected.\n");
    return;
    }
  cli_name[num-1]='\0';
  printf("client's name is %s.",cli_name);
  while(num=recv(connectfd,recvbuf,MAXDATASIZE,0)){
    recvbuf[num]='\0';
    printf("received client (%s) message:%s",cli_name,recvbuf);
    for(i=0,i<num-1,i++){
      sendbuf[i]=recvbuf[num-i-2];
    }
    sendbuf[num-1]='\0';
    send(connectfd,sendbuf,strlen(sendbuf),0);
  }
  close(connectfd);
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -