青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術(shù)中心

   :: 首頁 :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

#include <sys/epoll.h>
#include 
<unistd.h>
//#include <linux/tcp.h>
#include <netinet/tcp.h>
#include 
<sys/types.h>
#include 
<sys/socket.h>
#include 
<unistd.h>
#include 
<fcntl.h>
#include 
<errno.h>
#include 
<string.h>
#include 
<arpa/inet.h>
#include 
<stdio.h>
#include 
<vector>
#include 
"../../Common/TypeDefine.h"
#include 
"../../Common/MemPool.h"


int32 set_nonblocking(
int fd)
{
    int32 oflags;
    
if ((oflags = fcntl(fd, F_GETFL, 0)) == -1)
        
return errno;
       
    
if (fcntl(fd, F_SETFL, oflags | O_NONBLOCK) == -1)
        
return errno;
    
return 0;
}




int32 epollDel(
int epfd,struct epoll_event *pEpev)
{
     
return epoll_ctl(epfd, EPOLL_CTL_DEL,pEpev->data.fd, pEpev);
}


int32 main(
int argc,char *argv[])
{    
    
//創(chuàng)建套接字
    int32 listenfd = socket(AF_INET,SOCK_STREAM,0);
    
if(listenfd < 0)
        
return -1;
    
    
//將套接字設(shè)為異步
    int32 ret= set_nonblocking(listenfd);
    
if(ret != 0)
        
return -1;
  
    int32 flag 
= 1;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&flag, sizeof(flag)); //設(shè)置地址端口復(fù)用,服務(wù)器快速重起
    
    
// 設(shè)置SO_LINGER選項(防范CLOSE_WAIT掛住所有套接字)
    struct linger optval1;
    optval1.l_onoff 
= 1;
  optval1.l_linger 
= 60;
  setsockopt(listenfd, SOL_SOCKET, SO_LINGER, 
&optval1, sizeof(struct linger));
  
    
//創(chuàng)建epoll
    int32 maxSize = getdtablesize();  //返回某個進程所能打開的最大的文件數(shù)
    int32 epfd = epoll_create(maxSize);//創(chuàng)建一個epoll的句柄
    
    
if(epfd==-1)
        
return -1;
    printf(
"create epoll,maxSize=%d\n",maxSize);
    
    
//事件注冊
    struct epoll_event epev;
  epev.events 
= EPOLLIN| EPOLLET;
  epev.data.fd 
= listenfd;
  
  int32 err 
= epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &epev);
  
  printf(
"register epoll event finish!\n");
    
    
//綁定端口
    printf("start bind,port=%d\n",9300);
    
struct sockaddr_in saddr;
    memset(
&saddr,0,sizeof(struct sockaddr_in));
    saddr.sin_family 
= AF_INET;
    saddr.sin_port 
= htons(9300);
    saddr.sin_addr.s_addr 
= inet_addr("127.0.0.1");
    
    ret 
= bind(listenfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr_in));
  
if(ret < 0)
    
{
        
return -1;
    }


    ret 
= listen(listenfd,500);

    printf(
"listen finish!\n");
    

  
  
//循環(huán)
  int32 nev, i, millisecs = 200;
  
struct epoll_event m_evs[100];
  CHAR buf[
4096];
  
  
while(1)
  
{
             
if ((nev = epoll_wait(epfd, m_evs, 100, millisecs)) < 0)
                
{
                
if (errno == EINTR)
                    
continue;
                
else
                    
return -1;
            }

                   
          
for (i = 0; i < nev; i++{
              
                  printf(
"epoll wait event count=%d\n",nev);
                  
                           
if (m_evs[i].data.fd == listenfd)
                           
{
                                  
struct sockaddr_in addr;
                                  socklen_t len 
= sizeof(addr);
                                  int32 connfd 
= accept(listenfd,(struct sockaddr *)&addr, &len);
                                  
                                  printf(
"accept client fd=%d\n",connfd);
                                  
                                  
if (connfd < 0
                                  
{
                                            
if (errno == EWOULDBLOCK || errno == ECONNABORTED)
                                            
{
                                                printf(
"Failed to accept new connection (%s).\n", strerror(errno));
                                            
continue;
                                        }

                                            
else
                                                    
{
                                                        
//error
                                                        printf("Failed to accept new connection (%s).\n", strerror(errno));   
                                                        
continue;
                                                    }

                                            }

                                        
                                        
//將套接字設(shè)為異步
                                             if (set_nonblocking(connfd) != 0{
                                                close(connfd);
                                            
return -1;
                                        }

                                            
                                            int32 on
=1;
                                        setsockopt(connfd, IPPROTO_TCP, TCP_NODELAY,(
void *)&on,(socklen_t)sizeof(on));
                                        
                            
struct sockaddr_in clientaddr;
                            CHAR 
*str = inet_ntoa(clientaddr.sin_addr);
                            printf(
"accapt a connection from %s\n",str);
                            
                            
//設(shè)置用于讀操作的文件描述符
                            struct epoll_event ev;
                            ev.data.fd
=connfd;
                            
//設(shè)置用于注測的讀操作事件
                            ev.events=EPOLLIN|EPOLLET;
                            
//ev.data.ptr = new int8[4097];
                                            
                            
//注冊ev
                            epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
                            
                            printf(
"accept client register epoll event!\n");
                           }

                           
else if(m_evs[i].events&EPOLLIN)//如果是已經(jīng)連接的用戶,并且收到數(shù)據(jù),那么進行讀入
                           {
                               printf(
"EVENT->EPOLLIN\n");
                               
                               
//先屏掉測試
                               
//continue;
                               
                               
//如果套接字錯誤
                               int32 sockfd;
                               
if ( (sockfd = m_evs[i].data.fd) < 0)
                               
{
                                     printf(
"error socket!\n");
                            
continue;
                        }

                                    
                                  int32 rv 
= 0;
                                  BOOL bClose 
= FALSE;
                                  int32 totalRv 
= 0;
                                  
char buf[4097={0};
                                  
const int32 maxRead = 10;
                                  
                                  rv 
= read(m_evs[i].data.fd,buf+totalRv,maxRead-totalRv);
                                    
while((rv > 0|| (rv < 0 && errno == EINTR))
                                    
{
                                          
if(rv>0)
                                            
{
                                                    totalRv 
+= rv;
                                                  printf(
"read context=[%s]\n",buf);
                                            }

                                            printf(
"read current size = %d,total size=%d\n",rv,totalRv);
                                            
                                          
                                          
//緩沖區(qū)讀滿 
                                          if(totalRv >= maxRead)
                                            
{
                                                    
break;
                                            }

                                            
                                            rv 
= read(m_evs[i].data.fd,buf+totalRv,maxRead-totalRv);
                                  }

                                  
                                  
//對端連接關(guān)閉
                                  
//EAGAIN沒數(shù)據(jù),EINTR被中斷
                                  if(rv == 0 ||
                                      (rv 
< 0 && errno != EAGAIN && errno!=EINTR) )
                                  
{
                                         printf(
"read fail ,socket will close!\n");
                                         epollDel(epfd,
&m_evs[i]);
                                          close(m_evs[i].data.fd);
                             m_evs[i].data.fd 
= -1;
                             bClose 
= TRUE;
                                  }

                                  
else
                                  
{
                                       
//往對端發(fā)送寫入數(shù)據(jù)事件
                                        struct epoll_event ev;
                            ev.data.fd
=m_evs[i].data.fd;
                            
//設(shè)置用于注測的讀操作事件
                            
//ev.events=EPOLLIN|EPOLLOUT|EPOLLET;
                                            ev.events = m_evs[i].events | EPOLLOUT|EPOLLET;
                                            
                            
//將事件改為寫
                            int32 ret = epoll_ctl(epfd,EPOLL_CTL_MOD,ev.data.fd,&ev);
                            printf(
"end add event ret = %d\n",ret);
                            
                            
if(ret == -1)
                            
{
                                  printf(
"Failed to accept new connection (%s),errno=%d.\n", strerror(errno),errno);
                            }

                                  }

                      }

                      
else if(m_evs[i].events&EPOLLOUT)
                      
{
                                    printf(
"EVENT->EPOLLOUT\n");
                                    
                                    
//先不寫數(shù)據(jù)
                                    
//continue;
                                    
                                    
                                    int32 sockfd 
= m_evs[i].data.fd;
                                    
                                    
char buffer[4096]={0};
                                    
                                    CString str ;
                                    
                                    
for(int j=0;j<1;j++)
                                    
{
                                        str 
+= "0123456789";
                                    }

                                    
                                    strncpy(buffer,str.c_str(),
4095);
                                    
char *strPos = buffer;
                                    
int pos = 0;
                                    
int len = strlen(buffer);
                                    
                                    
int rv = write(sockfd,buffer+pos,len-pos);
                                            
while((rv >= 0|| (rv < 0 && errno == EINTR))
                                            
{
                                                  printf(
"write current size = %d,total size = %d\n",rv,pos);
                                                    
if(rv > 0)
                                                    
{
                                                         printf(
"write data size=%d\n",rv);
                                                    }

                                                
                                                  
//數(shù)據(jù)寫完跳出
                                                    if(pos+1==len)
                                                        
break;
                                                    
                                                    
                                                    
if(rv>0)
                                                      pos 
+= rv;
                                                    
                                                
if(len - pos <=0)
                                                
{
                                                    printf(
"send data finish! size = %d\n",len);
                                                    
break;
                                                }

                                                    rv 
= write(sockfd,buffer+pos,len-pos);
                                            }

                                            
                                            
if(rv < 0 && errno != EAGAIN && errno != EINTR)
                                            
{
                                                  printf(
"write fail ,socket will close!\n");
                                                epollDel(epfd,
&m_evs[i]);
                                                   close(m_evs[i].data.fd);
                                      m_evs[i].data.fd 
= -1;
                                            }

                      }

                      
else if (m_evs[i].events&EPOLLERR || m_evs[i].events&EPOLLHUP)
                      
{
                            printf(
"events error ,socket will close!\n");
                                        epollDel(epfd,
&m_evs[i]);
                                        close(m_evs[i].data.fd);
                                m_evs[i].data.fd 
= -1;
                      }

                  }

   }


}
posted on 2013-08-09 10:30 C++技術(shù)中心 閱讀(1755) 評論(0)  編輯 收藏 引用 所屬分類: Linux 編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            小黄鸭视频精品导航| 欧美一级日韩一级| 9人人澡人人爽人人精品| 欧美黑人在线观看| 亚洲国产精品va| 浪潮色综合久久天堂| 欧美在线国产| 国产精品福利久久久| 一区二区成人精品| 99国产精品99久久久久久粉嫩| 免费视频亚洲| 夜夜嗨av一区二区三区| 亚洲精品综合久久中文字幕| 欧美日韩免费在线| 亚洲国产精品专区久久| 91久久综合| 欧美成人中文字幕| 亚洲视频999| 久久国产精品久久国产精品| 亚洲国产一区二区三区在线播 | 欧美一区日本一区韩国一区| 国产一区二区欧美| 亚洲欧洲日本mm| 国内精品久久久久国产盗摄免费观看完整版| 久久精品1区| 欧美激情视频一区二区三区在线播放 | 欧美中文在线免费| 欧美成人午夜剧场免费观看| 亚洲欧美日韩国产成人精品影院 | 亚洲天堂av图片| 国产日韩欧美精品| 夜夜嗨av一区二区三区网页| 亚洲高清免费| 久久久久国内| 免费在线一区二区| 国产日韩欧美高清| 午夜日韩电影| 欧美在线观看一二区| 欧美女主播在线| 亚洲激情亚洲| 一区二区三区高清在线观看| 久久狠狠亚洲综合| 麻豆成人在线| 亚洲激情影视| 欧美成人综合一区| 亚洲高清不卡在线| 欧美成人精品在线| 亚洲国产激情| 亚洲精品一区在线| 欧美日韩免费网站| 午夜精品福利视频| 美女脱光内衣内裤视频久久影院 | 久久精品视频99| 久久国产夜色精品鲁鲁99| 久久久之久亚州精品露出| 激情综合自拍| 欧美日韩不卡| 午夜电影亚洲| 欧美电影在线| 亚洲欧美日韩国产综合精品二区| 国产视频久久久久久久| 亚洲欧美日韩综合一区| 欧美大胆成人| 亚洲一区二区三区四区五区午夜| 国产欧美精品日韩精品| 麻豆国产精品va在线观看不卡 | 亚洲在线免费观看| 免费人成网站在线观看欧美高清| 亚洲激情社区| 影音先锋久久| 国产精品女人毛片| 欧美日韩免费观看一区二区三区| 久久久不卡网国产精品一区| 亚洲精品国产精品国自产观看 | 亚洲激情视频在线播放| 国产亚洲欧洲| 国产酒店精品激情| 欧美日韩不卡在线| 欧美大成色www永久网站婷| 久久久91精品国产一区二区精品| 一本一本a久久| 亚洲成色www久久网站| 久久久久久日产精品| 蜜桃av噜噜一区| 另类天堂视频在线观看| 久久免费黄色| 久久资源在线| 久久―日本道色综合久久| 久久久久9999亚洲精品| 久久久亚洲一区| 老色鬼久久亚洲一区二区| 国产小视频国产精品| 国产亚洲欧美日韩精品| 亚洲国产精品黑人久久久| 影音先锋亚洲精品| 伊人久久婷婷| 亚洲免费高清| 欧美一区二区三区免费视频| 亚洲专区国产精品| 亚洲欧美国产精品va在线观看| 性做久久久久久| 久热国产精品视频| 久久伊人亚洲| 亚洲伦理在线| 欧美一区激情| 欧美日韩精品在线视频| 伊人久久婷婷色综合98网| 国产一区二区在线观看免费播放| 亚洲国产精品va在线观看黑人 | 亚洲人体偷拍| 夜夜爽夜夜爽精品视频| 久久精品国产亚洲aⅴ| 亚洲人成在线影院| 欧美影院午夜播放| 国产精品高清在线| 99精品视频免费在线观看| 久久综合中文字幕| 午夜精品久久久久久久白皮肤| 老司机成人在线视频| 国产偷国产偷精品高清尤物| 中文精品视频| 亚洲国产日韩一级| 欧美精品入口| 亚洲一二三区在线| 亚洲视频专区在线| 国产日韩精品一区二区三区在线| 久久久天天操| 欧美激情视频在线免费观看 欧美视频免费一 | 国模精品娜娜一二三区| 久久久精品久久久久| 久久精品国产99国产精品| 在线国产精品播放| 亚洲欧洲一区二区在线播放| 欧美日韩午夜激情| 欧美一区二区三区喷汁尤物| 亚洲天堂成人在线观看| 国产精品青草综合久久久久99| 亚洲婷婷在线| 一区二区三区四区蜜桃| 国产精品日韩欧美一区| 亚洲欧美另类在线观看| 中文亚洲欧美| 国产精品日韩欧美一区| 亚洲国产精品va在线看黑人| 亚洲国产精品激情在线观看| 日韩亚洲精品电影| 国产精品成人v| 久久嫩草精品久久久精品| 美女日韩欧美| 亚洲免费观看在线观看| 中文av一区特黄| 国模吧视频一区| 亚洲精品视频在线| 久久久99精品免费观看不卡| 亚洲人精品午夜| 亚洲校园激情| 亚洲激情二区| 亚洲一区二区在线观看视频| 在线观看成人av电影| 一区二区三区欧美成人| 欧美一级视频免费在线观看| 亚洲夫妻自拍| 香蕉久久一区二区不卡无毒影院| 亚洲精品视频免费| 久久精品国产在热久久| 亚洲精品在线观看免费| 欧美jjzz| 国产欧美精品一区二区色综合 | 韩国av一区二区三区在线观看| 欧美黄色一级视频| 羞羞视频在线观看欧美| 在线亚洲精品| 欧美乱大交xxxxx| 亚洲国产高潮在线观看| 亚洲黄一区二区| 久久手机精品视频| 美国成人毛片| 在线观看免费视频综合| 久久九九热re6这里有精品| 久久九九全国免费精品观看| 国产精品欧美一区二区三区奶水 | 免费在线亚洲| 亚洲电影免费观看高清| 久久伊人一区二区| 亚洲自拍偷拍麻豆| 国产精品日日摸夜夜添夜夜av| 亚洲午夜一区二区| 午夜精品久久久久久久久| 国产精品免费视频xxxx| 欧美一级视频一区二区| 欧美中文在线观看| 亚洲欧洲视频| 欧美r片在线| 亚洲午夜国产一区99re久久| 久久精品国产99| 亚洲精品视频在线看| 久久久一区二区| 免费成人av| 欧美在线在线| 亚洲免费一在线|