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

网络编程之负载均衡

2014-07-02 17:46 204 查看
#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;

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