网络编程之负载均衡

#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<signal.h>


#define MAXBACKLOG 64


void TCP_Select( int );


int main( void )
{
    int iRecvLen = 0, iSendLen = 0;
    int iRet = 0, i = 0;
    char sRecvBuf[128];
    int lsfd, lsfd1;
    struct sockaddr_in servaddr;


    memset(sRecvBuf, 0, sizeof(sRecvBuf));


    daemon_init();
    printf("主进程[%d]\n", getpid());


    lsfd = socket(AF_INET, SOCK_STREAM, 0);


    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    //servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(3001);


    if( bind(lsfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("bind err!\n");
        return -1;
    }


    if( listen(lsfd, MAXBACKLOG) < 0 )
    {
        printf("listen err!\n");
        return -1;
    }


    printf("开始创建子进程,for循环开始...\n");
    for( i = 0; i<3; i++ )
    {
        iRet = make_child();
        if( iRet < 0 )
        {

            break;
        }
        else if( iRet > 0 )
        {
            continue;
        }


        while( 1 )
        {
            //printf("select begin\n");
            TCP_Select( lsfd );
            //printf("select end\n");


            if( (lsfd1 = accept(lsfd, (struct sockaddr *)NULL, NULL)) < 0 )
            {
                printf("accept err!\n");
                return -1;
            }


            iRecvLen = recv(lsfd1, sRecvBuf, sizeof(sRecvBuf), 0);
            if( iRecvLen <= 0 )
            {
                printf("recv err!\n");

                return -1;
            }
            printf("processid[%d],sRecvBuf[%s][%d]\n", getpid(), sRecvBuf, iRecvLen);


            iSendLen = send(lsfd1, "000", 3, 0);

    if( iSendLen <= 0 )
            {
                printf("serv send[%s][%d]\n", "000", iSendLen);
                return -1;
            }


            printf("processid[%d],serv end!\n", getpid());
        }
    }
}


void TCP_Select( int iSocket )
{
    fd_set stFdSet;


    FD_ZERO( &stFdSet );
    FD_SET( iSocket, &stFdSet );
    select( iSocket + 1, &stFdSet, NULL, NULL, NULL );
}

int daemon_init()
{
    pid_t pid;


    if( getppid() == 1 )
    {
        umask(0);
        return 0;
    }


    if( (pid = fork()) < 0 )
    {
        printf("第一次fork err!\n");
        return -1;
    }
    else if( pid > 0 )
    {
        exit( 0 );
    }


    signal(SIGHUP, SIG_IGN);
    signal(SIGQUIT, SIG_IGN);

    signal(SIGCHLD, SIG_IGN);


    setsid();
    umask(0);


    return 0;
}


int make_child()
{
    pid_t pid;


    if( (pid = fork()) < 0 )
    {
        printf("fork err!\n");
        return -1;
    }
    else if( pid == 0 )
    {
        printf("子进程[%d]\n", getpid());
        return 0;
    }



    return pid;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值