多进程的编程实例

题目:启动client端和server端后,首先由Client端发送数据“1”给server端,server端接收到数据后加1后发送到client端,server端再加1发给client端,依次类推,直到server端接收到20,client端接收到19,两方中断收发。

要求:用多进程的思想实现

代码如下:

  client端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define   MAXLINE        4096
#define   SERV_PORT      9090
#define   SA             struct sockaddr



int
main(int argc,char ** argv)
{
        int     sockfd;
        char    sendline[MAXLINE],  recvline[MAXLINE];
        struct sockaddr_in   servaddr;
        long     arg1;
        int      m;

        if(argc != 2)
               printf("usage:./numaddcli <IPaddress>");
        if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0)
             {
             printf("create socket error:%s(error:%d)\n",strerror(errno),errno);
             exit(0);
              }
        
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family=AF_INET;
        servaddr.sin_port=htons(SERV_PORT);
        if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)
          {
           printf("inet_pton error for %s\n",argv[1]);
           exit(0);
           }

        if(connect(sockfd,(SA *) &servaddr,sizeof(servaddr))<0)
           {
             printf("connect error:%s(error: %d)\n",strerror(errno),errno);
             exit(0);
           }
      


   
        printf("send message to server:\n");
        scanf("%d",&m);
        while(m<=19)
          {
              printf("the client send number:%d\n",m);
              m=m+1;
              sprintf(sendline,"%d",m);
              write(sockfd,sendline,strlen(sendline));

              
            if(read(sockfd,recvline,MAXLINE)==0)
               printf("server terminated prematualy");
            m=atoi(recvline);

          }


        printf("my pid is %d\n",getpid());
       exit(0);
}



server端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define     SERV_PORT     9090
#define     LISTENQ       1024
#define     MAXLINE       4096
#define     SA            struct sockaddr


int
main(int argc,char **argv)
{
    int                     listenfd,connfd;
    char                    line[MAXLINE];
    struct sockaddr_in      servaddr,cliaddr;
    ssize_t                 n;
    socklen_t               clilen;
    pid_t                   childpid;
   // long                  arg1;
    int                     k;
    
    if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
     {
       printf("create socket error:%s(errno:%d)\n",strerror(errno),errno);
       exit(0);
      }
    
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family        =AF_INET;
    servaddr.sin_addr.s_addr   =htonl(INADDR_ANY);
    servaddr.sin_port          =htons(SERV_PORT);
    
     if(bind(listenfd,(SA *) &servaddr,sizeof(servaddr))!=0)
      {
        printf("bind  error:%s(errno:%d)\n",strerror(errno),errno);
       exit(0);
      }

     if(listen(listenfd,LISTENQ)==-1)
      {
        printf("listen socket error:%s(errno:%d)\n",strerror(errno),errno);
        exit(0);

      }
     printf("--------waiting for client request------\n");

     for( ; ; )
       { //循环接收各个进程
           clilen=sizeof(cliaddr);
           if( (connfd=accept(listenfd,(SA *)&cliaddr,&clilen)) < 0)
             {
               printf("accept  error:%s(errno:%d)\n",strerror(errno),errno);
               exit(0);
             }  
          if((childpid=fork())==0)
            {
                close(listenfd);
                printf("k is %d\n",k);
                while(k<20)
                  {
                     if((n=read(connfd,line,MAXLINE))==0)
                        return;
                     k=atoi(line);
                     printf("server receive number is: %d\n",k);
                     k=k+1;
                     sprintf(line,"%d",k);
                     write(connfd,line,strlen(line));
                               
                }
             printf("i am the chile process,pid is %d\n",getpid());
             exit(0);// 结束子进程
           }//if
       
            

            close(connfd);
            printf("i am the parent process,pid is %d\n",getpid());
           //exit(0);结束父进程
       }//for
   printf("aaaa");
   exit(0);
}

  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值