ACCEPT不群在“惊群”现象

服务器linux内核版本是:2.6.32。服务器创建3个子进程同时监听一个端口,客户端发送请求,只有一个子进程去相应,accept并没有出现网上说的惊群现象。

#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>


void* Signal(int signo, void* handler)
{
struct sigaction act, oact;


act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;


if(signo == SIGALRM)
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}


if(sigaction(signo, &act, &oact)<0)
{
return SIG_ERR;
}


return oact.sa_handler;
}


int main(int argc, char *argv[])
{
int sockfd;
int newsockfd;
unsigned int clilen;
char buffer[2560];
struct sockaddr_in serv_addr;
struct sockaddr_in cli_addr;
int n;
int flags=0;
int i=0;
pid_t fpid;
#ifdef SIGCLD
Signal(SIGCLD,SIG_IGN);
#endif


#ifdef SIGCHLD
Signal(SIGCHLD, SIG_IGN);
#endif
 
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
 printf("opening socket error! \n");
 exit(-1);
}
 
 
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(6578);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
   printf("socket binding error! \n");
   exit(-1);
}
 
listen(sockfd, 100);


while(i++<3)
{  
fpid=fork();
if (fpid < 0)   
            printf("error in fork!\n");
         else if(fpid==0)
         {  
          printf("fork ==[%d]== child\n", i);     
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
{
    printf("accept error! \n");
    exit(-1);
}
 printf("pid=[%d],accept one connect\n",getpid());
 n = read(newsockfd, buffer, sizeof(buffer));
 if (n < 0)
     printf("pid=[%d]error reading from socket! \n",getpid());
 else
     printf("pid=[%d]here is the message=== [%s] \n", getpid(),buffer);
 
 sleep(60);
 write()    
 close(sockfd);
 close(newsockfd);    
 exit(0);    
}
else
{
     printf("pid=[%d]father program! \n",getpid());
}
   
}  
     
     return 0;

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值