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