您的位置:首页 > 理论基础 > 计算机网络

linux TCP/IP网络编程(多进程)

2012-12-08 21:21 120 查看
多进程网络编程案例如下

#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
// may be use by getpid() and getppid()
#include <unistd.h>

int main(int argc, char *argv[]) 
{ 
  int sockfd,new_fd, mypid; 
  struct sockaddr_in server_addr; 
  struct sockaddr_in client_addr; 
  int sin_size,portnumber; 
  char hello[]="Hello! Are You Fine?"; 
  char buf[1024]; 
  int flag; 

  if(argc!=2) 
  { 
    fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); 
    exit(1); 
  } 

  if((portnumber=atoi(argv[1]))<0) 
  { 
    fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); 
    exit(1); 
  } 

  /* 服务器端开始建立socket描述符 */ 
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) 
  { 
    fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); 
    exit(1); 
  } 

  /* 服务器端填充 sockaddr结构 */ 
  bzero(&server_addr,sizeof(struct sockaddr_in)); 
  server_addr.sin_family=AF_INET; 
  server_addr.sin_addr.s_addr=htonl(INADDR_ANY); 
  server_addr.sin_port=htons(portnumber); 

  /* 捆绑sockfd描述符 */ 
  if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 
  { 
    fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); 
    exit(1); 
  } 

  /* 监听sockfd描述符 */ 
  if(listen(sockfd,5)==-1) 
  { 
    fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); 
    exit(1); 
  }
  
  // printf my PID num
  printf("Starting Server at port: %d Success. My PID is: %d\nAccepting Request...\n", portnumber, getpid());

  while(1) 
  { 
    /* 服务器阻塞,直到客户程序建立连接 */ 
    sin_size=sizeof(struct sockaddr_in); 
    if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) 
    { 
      fprintf(stderr,"Accept error:%s\n\a",strerror(errno)); 
      exit(1); 
    } 
    
    // 生成一个子进程来完成和客户端的会话,父进程继续监听
    if (!fork())
    {
      // print my PID and my parent PID
      mypid = getpid();
      printf("Accepting new connection...\nNow I will server for you. My PID is: %d\nMy parent PID is: %d\n", mypid, getppid());
      // 子进程,关闭父进程监听套接字
      close(sockfd);
      fprintf(stderr,"Server get connection from %s\n", 
      inet_ntoa(client_addr.sin_addr)); 
      if(write(new_fd,hello,strlen(hello))==-1) 
      { 
        fprintf(stderr,"Write Error:%s\n",strerror(errno)); 
        exit(1); 
      } 

      while(1) //get data from client
      {
        if((flag=read(new_fd,buf,1024))<0)
        {  
          printf("Reading data error");
          break;
        }
        if(flag==0)
        {
          printf("[PID:%d] Ending current connection\n",mypid);          
          break;
        } 
        else
        {
          printf("[PID:%d] -->%s\n",mypid,buf);
          if(strstr(buf,"exit"))
          {
	    printf("I get 'exit' string, so close client connection\n");
	    break;
          } 
        }
       
      }  //end while (get data from client)
         // 连接丢失,结束进程 (客户主动断开,网络问题自动断开)
      printf("Connection lose. End child program, PID: %d\n", getpid());
      close(new_fd);
      exit(0);

    } // if fork
    
    // 父进程关闭新套接字,继续监听请求
    close(new_fd);
  
  }  //while
  
  close(sockfd); 
  exit(0); 

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: