SO_REUSEADDR

任何TCP服务器都应该设置此选项,避免出现当服务器listen父进程崩溃后但已经存在子进程处理客户连接,在此情况下重启问题。

我的inilisten函数,用于建立listen的sockfd

int initlisten(int port)
{
  int listenfd;
  struct sockaddr_in servaddr;
  if( (listenfd = socket(AF_INET,SOCK_STREAM,0))< 0)
  {
       printf("socket error! %s\n",strerror(errno));
       return -1;
  }
  bzero(&servaddr,sizeof(struct sockaddr_in));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(port);
  int optval = 1;
  if(-1 == (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))) )
  {
      printf("set REUSEADDR error! %s,%d\n",strerror(errno),port);
  }
  if( -1 == (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))) )
  {
      printf("bind error! %s,%d\n",strerror(errno),port);
      return -1;
  }
  if( -1 == (listen(listenfd,1024)))
  {
      printf("listen error! %s,%d\n",strerror(errno),port);
      return -1;
  }
   return listenfd;
}
转载请注明来源:Leoncom-《SO_REUSEADDR》
Trackback

no comment untill now

Add your comment now