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