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

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(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[])
{    
    
//創建套接字
    int32 listenfd = socket(AF_INET,SOCK_STREAM,0);
    
if(listenfd < 0)
        
return -1;
    
    
//將套接字設為異步
    int32 ret= set_nonblocking(listenfd);
    
if(ret != 0)
        
return -1;
  
    int32 flag 
= 1;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&flag, sizeof(flag)); //設置地址端口復用,服務器快速重起
    
    
// 設置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));
  
    
//創建epoll
    int32 maxSize = getdtablesize();  //返回某個進程所能打開的最大的文件數
    int32 epfd = epoll_create(maxSize);//創建一個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");
    

  
  
//循環
  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;
                                                    }

                                            }

                                        
                                        
//將套接字設為異步
                                             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);
                            
                            
//設置用于讀操作的文件描述符
                            struct epoll_event ev;
                            ev.data.fd
=connfd;
                            
//設置用于注測的讀操作事件
                            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)//如果是已經連接的用戶,并且收到數據,那么進行讀入
                           {
                               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);
                                            
                                          
                                          
//緩沖區讀滿 
                                          if(totalRv >= maxRead)
                                            
{
                                                    
break;
                                            }

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

                                  
                                  
//對端連接關閉
                                  
//EAGAIN沒數據,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
                                  
{
                                       
//往對端發送寫入數據事件
                                        struct epoll_event ev;
                            ev.data.fd
=m_evs[i].data.fd;
                            
//設置用于注測的讀操作事件
                            
//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");
                                    
                                    
//先不寫數據
                                    
//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);
                                                    }

                                                
                                                  
//數據寫完跳出
                                                    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++技術中心 閱讀(1754) 評論(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>
            99成人在线| 欧美性生交xxxxx久久久| 香蕉成人伊视频在线观看| 久久久五月天| 欧美视频在线免费看| 亚洲国产日韩欧美综合久久| 欧美一区免费视频| 亚洲片区在线| 亚洲综合色婷婷| 国产精品草莓在线免费观看| 亚洲校园激情| 欧美激情亚洲精品| 欧美专区18| 国产一区二区三区高清在线观看| 亚洲无吗在线| 欧美日韩在线三级| 亚洲午夜av电影| 亚洲精品视频啊美女在线直播| 久久精品国产亚洲a| 国产一区二区三区视频在线观看| 欧美主播一区二区三区| 亚洲一区视频在线| 国产日韩精品一区二区浪潮av| 亚洲欧洲一区二区在线播放 | 午夜精品免费| 国产美女精品一区二区三区| 欧美一级欧美一级在线播放| 午夜精品理论片| 国产日韩欧美高清| 久久久久久久999精品视频| 欧美一区二区三区在线| 亚洲福利视频网站| 亚洲国产精品va| 欧美日韩激情网| 欧美亚洲一级片| 性视频1819p久久| 国产一区二区你懂的| 欧美www视频| 欧美日韩在线免费| 亚洲一区二区三区777| 亚洲网站在线观看| 韩国三级在线一区| 免费观看欧美在线视频的网站| 久久综合色播五月| 一区二区三区色| 欧美一区二区三区免费视| 久久久人成影片一区二区三区观看| 久久久亚洲成人| 久久国产精品高清| 亚洲精品在线视频| 亚洲一区精彩视频| 亚洲福利专区| 亚洲图片在线观看| 一区二区三区在线免费播放| 亚洲欧洲一区| 国产精品美女999| 毛片一区二区| 国产精品久久久久9999| 免费成人毛片| 国产欧美一区二区精品性| 亚洲大胆视频| 国产精品国产| 亚洲经典视频在线观看| 狠狠色伊人亚洲综合网站色| 中文国产成人精品| 亚洲国产高清一区二区三区| 午夜久久久久久| 午夜精品久久久久久久99樱桃| 美女网站在线免费欧美精品| 久久久久国产一区二区三区四区| 欧美第一黄网免费网站| 久久精品观看| 国产噜噜噜噜噜久久久久久久久| 亚洲青色在线| 亚洲精选久久| 牛人盗摄一区二区三区视频| 久久久综合网站| 国产美女精品视频免费观看| 在线视频精品| 在线视频欧美精品| 欧美电影资源| 欧美freesex交免费视频| 韩国精品在线观看| 性8sex亚洲区入口| 久久国产手机看片| 国产精品草莓在线免费观看| 日韩午夜三级在线| 夜色激情一区二区| 欧美巨乳在线观看| 亚洲精品一区二区三区在线观看 | 欧美成人国产| 狠狠88综合久久久久综合网| 欧美专区日韩专区| 麻豆91精品| 亚洲国内自拍| 欧美国产精品日韩| 亚洲人成网站777色婷婷| 亚洲乱码精品一二三四区日韩在线| 麻豆成人综合网| 亚洲第一主播视频| 99热精品在线观看| 欧美性猛片xxxx免费看久爱 | 久久综合久久综合九色| 欧美成人免费全部观看天天性色| 亚洲东热激情| 欧美高清视频在线 | 欧美不卡高清| 亚洲区欧美区| 亚洲一区二区三区在线| 亚洲影院高清在线| 国产精品亚洲精品| 午夜精品亚洲| 免费观看欧美在线视频的网站| 亚洲国产精品成人一区二区| 欧美精品999| 亚洲神马久久| 久久久久久久久久码影片| 影音先锋亚洲一区| 欧美精品久久久久久久免费观看 | 久久久综合免费视频| 亚洲国产精品久久久久秋霞影院 | 欧美视频中文字幕| 亚洲欧美日韩精品| 欧美成人精品一区| 亚洲一区免费| 激情丁香综合| 欧美日韩国产三级| 欧美一区二区精品| 亚洲精品一区二| 久久久精品动漫| 夜夜爽av福利精品导航 | 亚洲免费福利视频| 国产精品一区视频网站| 美女在线一区二区| 亚洲一区二区免费视频| 欧美xart系列高清| 亚洲网址在线| 亚洲高清不卡av| 国产精品日本| 欧美高清在线一区二区| 午夜精品久久久久99热蜜桃导演| 欧美肥婆在线| 久久精品国产清高在天天线| 一本一本a久久| 亚洲国产成人精品女人久久久| 国产毛片精品国产一区二区三区| 欧美经典一区二区| 久久嫩草精品久久久精品| 亚洲免费一在线| 一区二区三区精品| 最近中文字幕日韩精品 | 午夜精品999| 亚洲精品永久免费| 国语自产在线不卡| 国产精品久久久久久久久久免费| 免费在线成人av| 久久精品系列| 欧美一区二区三区视频免费| 这里只有精品丝袜| 一区二区激情| 日韩午夜激情av| 亚洲精品一级| 亚洲日本黄色| 欧美大片免费久久精品三p| 久久蜜桃香蕉精品一区二区三区| 亚洲综合色婷婷| av成人免费在线| 亚洲精品欧美极品| 亚洲国产免费| 亚洲国产福利在线| 欧美在线啊v| 亚洲欧美制服另类日韩| 亚洲美女av电影| 亚洲精美视频| 亚洲人成毛片在线播放| 亚洲激情一区二区| 最新国产拍偷乱拍精品| 亚洲激情小视频| 亚洲三级色网| 日韩亚洲精品视频| 一区二区三区视频在线| 亚洲一区二区三区色| 亚洲欧美日韩久久精品| 午夜在线视频观看日韩17c| 亚洲欧美电影院| 欧美中日韩免费视频| 久久久精品一区二区三区| 久久久99精品免费观看不卡| 久久久亚洲国产天美传媒修理工 | 久久久久久亚洲综合影院红桃 | 亚洲一区在线观看免费观看电影高清| 日韩亚洲欧美成人一区| 一区二区三区欧美| 亚洲永久在线观看| 午夜亚洲影视| 久久视频一区二区| 欧美黑人多人双交| 国产精品黄色| 一区二区亚洲| 亚洲视频www|