设为首页 加入收藏

TOP

基于EPOLL写的HTTP服务器(加入了线程池)(三)
2012-08-26 14:11:58 】 浏览:11812
Tags:基于 EPOLL HTTP 服务器 加入 线程
bsp;        return -1;
                    }
           }
    return 0;
}

void setnoblock(int sockFd)         //设置非阻塞模式
{
int opt;
if((opt=fcntl(sockFd,F_GETFL))<0)  //获取原来的flag;
    {
    printf("GET FL failed!\n");
    exit(-1);
     }
 opt|=O_NONBLOCK;
  if(fcntl(sockFd,F_SETFL,opt)<0)
 printf("SET FL failed!\n");


}

int main()
{
  int serverFd,j;
  serverFd=socket(AF_INET,SOCK_STREAM,0); //创建服务器fd
    setnoblock(serverFd);                   //设置为非阻塞模式
    unsigned int        optval;
    struct linger        optval1;
    //设置SO_REUSEADDR选项(服务器快速重起)
      optval = 0x1;
      setsockopt(serverFd, SOL_SOCKET, SO_REUSEADDR, &optval, 4);

     // 设置SO_LINGER选项(防范CLOSE_WAIT挂住所有套接字)
     optval1.l_onoff = 1;
     optval1.l_linger = 60;
     setsockopt(serverFd, SOL_SOCKET, SO_LINGER, &optval1, sizeof(struct linger));

          //创建epoll,并将serverFd放入监听队列
    epFd=epoll_create(EPOLL_SIZE);

    ev.data.fd=serverFd;
    ev.events=EPOLLIN|EPOLLET;
    epoll_ctl(epFd,EPOLL_CTL_ADD,serverFd,&ev);

         //绑定服务器端口
   struct sockaddr_in serverAddr;
   socklen_t serverlen=sizeof(struct sockaddr_in);
   serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
   serverAddr.sin_port=htons(PORT);
    if(bind(serverFd,(struct sockaddr*)&serverAddr,serverlen))
          {
       printf("BIND failed!\n");
       exit(-1);
          }

    //线程池初始化
    int rc = init_thread_pool();
    if (0 != rc) exit(-1);



    //打开监听
    if(listen(serverFd,BACK_QUEUE))
          {
          printf("Listen failed!\n");
          exit(-1);
          }

       &nb
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇 select, poll和epoll的区别 下一篇VC实现线程池

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目