網絡編程之負載均衡

#include
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章