服务器端编程实例(三 多进程并发)

程序说明:  多进程并发,在接收到请求时,fork个进程,对父进程则关闭连接Socket,而子进程则关闭监听socket,每一个新的accept请求都由子进程来执行,而由父进程继续listen.
/***************************************************************************
*     author: denny wqf363@hotmail.com 2006  
*     desc:  多进程并发
*     座友铭:凡是程序当前不需要的,都是垃圾,80%的时间做20%的事情。(程序的效率)
*                                                                          *
***************************************************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include      <malloc.h>
#include <stdlib.h>
 
#define BACKLOG 5
#define MAXDATASIZE 1000
#define PORT 1234
 
void process_cli(int,sockaddr_in);
 
int main(int argc,char *argv[])       //需要一个参数 端口号
{
    int    listenfd,                        //监听套接字sock
    connectfd;                    //accept 收到的 新套接字
    struct sockaddr_in servAddr,       //服务器地址
    cliAddr;   //客户端地址
    socklen_t adrlen;                   //sockaddr地址长度
    int           servPort;               //服务器监听端口号
    pid_t             pid;
 
    //获得服务器监听的端口号
    if(argc!=2)
    {
              printf("Usage:%s portnumber/a/n",argv[0]);
              return 1;
    }
 
    if((servPort=atoi(argv[1]))<0)
    {
              printf("Usage:%s portnumber/a/n",argv[0]);
              return 1;
    }
 
    /* 服务器端开始建立socket描述符 */
    if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
              fprintf(stderr,"Socket error:%s/n/a",strerror(errno));
              return 1;
    }
 
    /*设置套接字地址结构体servAddr中的参数,绑定服务器端口号*/
    servAddr.sin_family=AF_INET;
    servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servAddr.sin_port=htons(servPort);
 
    if(bind(listenfd,(struct sockaddr *)&servAddr,sizeof(servAddr))<0)
    {
              printf("Bind error:%s/n/a",strerror(errno));
              exit(2);
    }
 
    /* 监听sockfd描述符 */
    if(listen(listenfd,BACKLOG)==-1)
    {
              printf("Listen error:%s/n/a",strerror(errno));
              exit(3);
    }
 
    while(1)
    {
        printf("%s:waiting for data on port TCP %u/n",argv[0],servPort);
 
        adrlen=sizeof(struct sockaddr_in);
        connectfd=accept(listenfd,(struct sockaddr *)&cliAddr,&adrlen);
        if(connectfd<0)
        {
                     perror("accetp() error/n");
                     exit(4);
        }
 
        //采用多进程
        if((pid=fork()) >0)
        {    
                     close(connectfd);
                     continue;
        }
        else if(pid==0)
        {
                     close(listenfd);
                     process_cli(connectfd,cliAddr);
                     exit(0);
        }
        else        
        {
                     printf("fork() error./n");
                     exit(0);
        }    
    }
    close(listenfd);
}
 
void process_cli(int connectfd, sockaddr_in client)
{
       //....
    close(connectfd);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值