网络编程之负载均衡
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;
}
#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;
}
相关文章推荐
- Linux IPC之Socket网络编程服务器的负载均衡
- 网络工程师交换试验手册之四:静态路由的负载均衡
- Nginx网络负载均衡,负载均衡,网络负载,网络均衡
- 公司网络web服务器负载均衡解决方案
- 网络结构设计——负载均衡之LVS学习笔记(三)
- 负载均衡网络设计 把负载均衡当作二层交换机还是三层路由器
- 负载均衡原理与实践详解 第十六篇 负载均衡网络设计 把负载均衡当作二层交换机还是三层路由器
- 网络结构设计——负载均衡之LVS学习笔记(四)
- 网络工程师交换试验手册之四:静态路由的负载均衡网络工程师交换试验手册之四:静态路由的负载均衡
- 关于网络层的负载均衡和热备
- 谁动了我的网络系列 之eigrp 选路 等价 负载 均衡非等价负载均衡等 ..
- IT 网络产品厂商聚焦(路由、交换、网络安全、负载均衡、防火墙、行为管理、邮件网关、计费等)
- 关于网络层的负载均衡和热备
- 几种常用的网络负载均衡方式比较
- 公司网络web服务器负载均衡解决方案
- 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础