- 論壇徽章:
- 0
|
本帖最后由 hy0kl 于 2011-04-01 17:13 編輯
- epoll程序都使用下面的框架:
- for( ; ; )
- {
- nfds = epoll_wait(epfd, events, 20, 500);
- for(i = 0; i < nfds; ++i)
- {
- if(events[i].data.fd == listenfd) //有新的連接
- {
- connfd = accept(listenfd, (sockaddr *)&clientaddr, &clilen); //accept這個(gè)連接
- ev.data.fd = connfd;
- ev.events = EPOLLIN | EPOLLET;
- epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ev); //將新的fd添加到epoll的監(jiān)聽隊(duì)列中
- }
- else if( events[i].events & EPOLLIN ) //接收到數(shù)據(jù),讀socket
- {
- n = read(sockfd, line, MAXLINE)) < 0 //讀
- ev.data.ptr = md; //md為自定義類型,添加數(shù)據(jù)
- ev.events = EPOLLOUT | EPOLLET;
- epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);//修改標(biāo)識符,等待下一個(gè)循環(huán)時(shí)發(fā)送數(shù)據(jù),異步處理的 精髓
- }
- else if(events[i].events & EPOLLOUT) //有數(shù)據(jù)待發(fā)送,寫socket
- {
- struct myepoll_data* md = (myepoll_data*)events[i].data.ptr; //取數(shù)據(jù)
- sockfd = md->fd;
- send( sockfd, md->ptr, strlen((char*)md->ptr), 0 ); //發(fā)送數(shù)據(jù)
- ev.data.fd = sockfd;
- ev.events = EPOLLIN | EPOLLET;
- epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev); //修改標(biāo)識符,等待下一個(gè)循環(huán)時(shí)接收數(shù)據(jù)
- }
- else
- {
- //其他的處理
- }
- }
- }
復(fù)制代碼 |
|