Пример #1
0
int billing_epoll_wait()
{
	int nfds;
	int i;
	int ret=0 ;

	nfds = epoll_wait(kdpfd, events, MAX_EVENTS, EPOLL_TIMEOUT);
	if(nfds == -1) {
		if( errno != EINTR ) {
			return -1;
		}

	} else if( 0 == nfds) {
		return 0;
	}


	for (i = 0; i < nfds; i++) {
		if (listen_fd == events[i].data.fd){
			handle_accept(listen_fd);
		}
		else if (events[i].events & EPOLLIN){
			read_billing_info(events[i].data.fd);
		}
		else if (events[i].events & (EPOLLHUP|EPOLLERR)){
			disconnect_fd(events[i].data.fd);
		}
	}
	return ret;
}
Пример #2
0
static void server_mainloop() {
  int64 sock;

  /* inlined livesync_init() */
  memset( g_peerbuffer_start, 0, sizeof( g_peerbuffer_start ) ); 
  g_peerbuffer_pos = g_peerbuffer_start;
  memcpy( g_peerbuffer_pos, &g_tracker_id, sizeof( g_tracker_id ) );
  uint32_pack_big( (char*)g_peerbuffer_pos + sizeof( g_tracker_id ), OT_SYNC_PEER);
  g_peerbuffer_pos += sizeof( g_tracker_id ) + sizeof( uint32_t);
  g_next_packet_time = time(NULL) + LIVESYNC_MAXDELAY;

  while(1) {
    /* See, if we need to connect to anyone */
    if( time(NULL) > g_connection_reconn )
      handle_reconnects( );

    /* Wait for io events until next approx reconn check time */
    io_waituntil2( 30*1000 );

    /* Loop over readable sockets */
    while( ( sock = io_canread( ) ) != -1 ) {
      const void *cookie = io_getcookie( sock );
      if( (uintptr_t)cookie == FLAG_SERVERSOCKET )
        handle_accept( sock );
      else
        handle_read( sock );
    }

    /* Loop over writable sockets */
    while( ( sock = io_canwrite( ) ) != -1 )
      handle_write( sock );

    livesync_ticker( );
  }
}
Пример #3
0
int main() {
        init_epoll();
        create_socket();
        setup_signals();

        while (running) {
                struct epoll_event event;
                int ret = epoll_wait(epoll_fd, &event, 1, -1);
                if (ret == 0)
                        continue;

                if (ret < 0) {
                        if (errno == EINTR)
                                continue;

		        syslog(LOG_ERR, "epoll_wait: %s\n", strerror(errno));
                        exit(1);
                }

                if (event.data.ptr == &listen_event)
                        handle_accept(event.events);
                else
                        handle_data(event.data.ptr);
        }

        cleanup();
}
Пример #4
0
 void pipeline_acceptor::do_accept( void ){
     _fd = std::move( tcp::socket( engine() )); 
     _acceptor.accept( _fd , [this]( const std::error_code& ec 
             , const tcode::io::ip::address& addr )
         {
             handle_accept( ec , addr );
         });
 }
Пример #5
0
int main(int argc,char* argv[])
{
	if(argc!=2)
	{
		printf("Usage:./server port\n");
		return 1;
	}
	int listen_sock=socket(AF_INET,SOCK_STREAM,0);
	assert(listen_sock>=0);
	sockaddr_in local;
	local.sin_family=AF_INET;
	local.sin_port=htons(atoi(argv[1]));
	local.sin_addr.s_addr=INADDR_ANY;
	if(bind(listen_sock,(sockaddr*)&local,sizeof(local))==-1)
	{
		perror(strerror(errno));
		return 2;
	}
	if(listen(listen_sock,5)==-1)
	{
		perror(strerror(errno));
		return 3;
	}
	sockaddr_in client;
	socklen_t len=sizeof(client);
	while(1)
	{
		int new_sock=accept(listen_sock,(sockaddr*)&client,&len);
		if(new_sock==-1)
		{
			continue;
		}
		else
		{
			pid_t id=fork();
			assert(id>=0);
			if(id>0)
			{
				wait(NULL);
			}
			else
			{
				pid_t tid=fork();
				assert(tid>=0);
				if(tid>0)
				{
					exit(0);
				}
				else
				{
					return handle_accept(new_sock);
				}
			}

		}
	}
	return 0;
}
Пример #6
0
/**
 * The listener thread main function. The listener listens for
 * connections from clients.
 */
static void *listener_main(void *arg_p)
{
    struct http_server_t *self_p = arg_p;
    struct http_server_listener_t *listener_p;
    struct http_server_connection_t *connection_p;
    struct inet_addr_t addr;

    thrd_set_name(self_p->listener_p->thrd.name_p);

    listener_p = self_p->listener_p;

    if (socket_open_tcp(&listener_p->socket) != 0) {
        log_object_print(NULL,
                         LOG_ERROR,
                         FSTR("Failed to open socket."));
        return (NULL);
    }

    if (inet_aton(listener_p->address_p, &addr.ip) != 0) {
        return (NULL);
    }

    addr.port = listener_p->port;

    if (socket_bind(&listener_p->socket, &addr) != 0) {
        log_object_print(NULL,
                         LOG_ERROR,
                         FSTR("Failed to bind socket."));
        return (NULL);

    }

    if (socket_listen(&listener_p->socket, 3) != 0) {
        log_object_print(NULL,
                         LOG_ERROR,
                         FSTR("Failed to listen on socket."));
        return (NULL);

    }

    /* Wait for clients to connect. */
    while (1) {
        /* Allocate a connection. */
        connection_p = allocate_connection(self_p);

        /* Wait for a client to connect. */
        socket_accept(&listener_p->socket,
                      &connection_p->socket,
                      &addr);

        handle_accept(self_p, connection_p);
    }

    return (NULL);
}
Пример #7
0
static void handle_fd_set(isrv_state_t *state, fd_set *fds, int (*h)(int, void **))
{
	enum { LONG_CNT = sizeof(fd_set) / sizeof(long) };
	int fds_pos;
	int fd, peer;
	/* need to know value at _the beginning_ of this routine */
	int fd_cnt = FD_COUNT;

	if (LONG_CNT * sizeof(long) != sizeof(fd_set))
		BUG_sizeof_fd_set_is_strange();

	fds_pos = 0;
	while (1) {
		/* Find next nonzero bit */
		while (fds_pos < LONG_CNT) {
			if (((long*)fds)[fds_pos] == 0) {
				fds_pos++;
				continue;
			}
			/* Found non-zero word */
			fd = fds_pos * sizeof(long)*8; /* word# -> bit# */
			while (1) {
				if (FD_ISSET(fd, fds)) {
					FD_CLR(fd, fds);
					goto found_fd;
				}
				fd++;
			}
		}
		break; /* all words are zero */
 found_fd:
		if (fd >= fd_cnt) { /* paranoia */
			DPRINTF("handle_fd_set: fd > fd_cnt?? (%d > %d)",
					fd, fd_cnt);
			break;
		}
		DPRINTF("handle_fd_set: fd %d is active", fd);
		peer = FD2PEER[fd];
		if (peer < 0)
			continue; /* peer is already gone */
		if (peer == 0) {
			handle_accept(state, fd);
			continue;
		}
		DPRINTF("h(fd:%d)", fd);
		if (h(fd, &PARAM_TBL[peer])) {
			/* this peer is gone */
			remove_peer(state, peer);
		} else if (TIMEOUT) {
			TIMEO_TBL[peer] = monotonic_sec();
		}
	}
}
Пример #8
0
void handle_message(struct msg incoming_msg, struct state_info info) {
	char diag[200];
	sprintf(diag,"receive %s from %d [phase=%s, timestamp=%d, lift_number=%s]",
					stringify(incoming_msg.tag), incoming_msg.sender_tid, stringify(info.phase),
					incoming_msg.timestamp, stringify(incoming_msg.tag == MSG_ACCEPT ? -1 : incoming_msg.lift_number));
	diag_msg(info.mstrtid, info.mytid, diag);

  switch (incoming_msg.tag) {
    case MSG_REQUEST:	handle_request(incoming_msg, info); break;
    case MSG_ACCEPT:	handle_accept (incoming_msg, info); break;
    case MSG_RELEASE:	handle_release(incoming_msg, info); break;
  }
}
Пример #9
0
void handle_events(int epollfd, struct epoll_event *events, int num, int listenfd, char* buf){
	int i, fd;
	for(i = 0; i < num; ++i){
		fd = events[i].data.fd;
		if((fd == listenfd) && (events[i].events & EPOLLIN)){
			handle_accept(epollfd, listenfd);
		}else if(events[i].events & EPOLLIN){
			do_read(epollfd, fd, buf);
		}else if(events[i].events & EPOLLOUT){
			do_write(epollfd, fd, buf);
		}
	}
}
Пример #10
0
static void
handle_events(int epollfd,struct epoll_event *events,int num,int listenfd,char *buf)
{
    int i;
    int fd;
    //进行选好遍历
    for (i = 0;i < num;i++)
    {
        fd = events[i].data.fd;
        //根据描述符的类型和事件类型进行处理
        if ((fd == listenfd) &&(events[i].events & EPOLLIN))
            handle_accept(epollfd,listenfd);
        else if (events[i].events & EPOLLIN)
            do_read(epollfd,fd,buf);
        else if (events[i].events & EPOLLOUT)
            do_write(epollfd,fd,buf);
    }
}
Пример #11
0
static void server_mainloop( ) {
  static time_t ot_last_clean_time;
  time_t        next_timeout_check = g_now + OT_CLIENT_TIMEOUT_CHECKINTERVAL;
  struct        iovec *iovector;
  int           iovec_entries;

  for( ; ; ) {
    int64 i;

    io_wait();

    while( ( i = io_canread( ) ) != -1 ) {
      const void *cookie = io_getcookie( i );
      if( cookie == FLAG_TCP )
        handle_accept( i );
      else if( cookie == FLAG_UDP )
        handle_udp4( i );
      else
        handle_read( i );
    }

    while( ( i = mutex_workqueue_popresult( &iovec_entries, &iovector ) ) != -1 )
      http_sendiovecdata( i, iovec_entries, iovector );

    while( ( i = io_canwrite( ) ) != -1 )
      handle_write( i );

    if( g_now > next_timeout_check ) {
      while( ( i = io_timeouted() ) != -1 )
        handle_dead( i );
      next_timeout_check = g_now + OT_CLIENT_TIMEOUT_CHECKINTERVAL;
    }

    /* See if we need to move our pools */
    if( NOW != ot_last_clean_time ) {
      ot_last_clean_time = NOW;
      clean_all_torrents();
    }

    /* Enforce setting the clock */
    signal_handler( SIGALRM );
  }
}
Пример #12
0
void handle_poll(int listenfd)
{
	int connfd, sockfd;
	struct sockaddr_in cliaddr;
	socklen_t cliaddrlen;
	struct pollfd clientfds[OPEN_MAX];
	int nready;


	//添加监听描述符
	clientfds[0].fd = listenfd;
	clientfds[0].events = POLLIN;

	//初始化客户连接描述符
    //int i, conn_num = 1;
    int i, imax = 0;
	for (i = 1; i < OPEN_MAX; i++)
	{
        	clientfds[i].fd = -1;
	}
    //循环处理
    while(1)
    {
	    //获取可用描述符的个数
	    printf("wztest ==================\n");

	    nready = poll(clientfds, imax + 1 , -1);
	    if (nready == -1)
	    {
	        perror("poll error:");
	        exit(1);
	    }

        if (clientfds[0].revents & POLLIN) {
            handle_accept(listenfd, clientfds, &imax);
        }

        //if (--nready > 0){
            handle_connect(clientfds, imax);
        //}

	}
}
Пример #13
0
static void handle_events( int _epollfd, struct epoll_event* _events, int _num, int _listenfd, char* _buf )
{
	int fd = 0;
	for( int i = 0; i < _num; ++i )
	{
		fd = _events[i].data.fd;
		//根据描述符的类型和事件类型进行处理
		if( (fd == _listenfd) && (_events[i].events & EPOLLIN) )
		{
			handle_accept( _epollfd, _listenfd );
		}
		else if( _events[i].events & EPOLLIN )
		{
			do_read( _epollfd, fd, _buf );
		}
		else if( _events[i].events & EPOLLOUT )
		{
			do_write( _epollfd, fd, _buf );
		}
	}
}
Пример #14
0
int
main(int argc, char *argv[])
{
	int err;
	int nfds;
	int socketfd;

        db_t db;
        db_option_t option;

	fd_set readfds;
	fd_set writefds;

	char *dbfilename;
	char *idxfilename;

	struct addrinfo hints, *ai, *p;

	if (argc == 2) {
		dbfilename  = argv[1];
		idxfilename = NULL;
	} else if (argc != 3) {
		dbfilename  = argv[1];
		idxfilename = argv[2];
	} else {
		fprintf(stderr, "usage: %s dbfile [indexfile]\n", argv[0]);

		return 0;
	}

	memset(&hints, 0, sizeof(hints));
	
	hints.ai_family   = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags    = AI_PASSIVE;

	if ((err = getaddrinfo(NULL, PORT, &hints, &ai)) != 0) {
		fprintf(stderr, "db-server: getaddrinfo: %s\n", gai_strerror(err));

		exit(1);
	}

	for (p = ai; p != NULL; p = p->ai_next) {
		int optval = 1;

		socketfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
		if (socketfd == -1) {
			fprintf(stderr, "db-server: socket: %s\n", gai_strerror(err));

			continue;
		}
		if (fcntl(socketfd, F_SETFL, O_NONBLOCK) == -1) {
			fprintf(stderr, "db-server: fcntl NONBLOCK: %s\n", strerror(errno));

			continue;
		}

		if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) {
			fprintf(stderr, "db-server: setsockopt REUSEADDR: %s\n", strerror(errno));

			continue;
		}

		if (bind(socketfd, p->ai_addr, p->ai_addrlen) < 0) {
			fprintf(stderr, "db-server: bind: %s\n", strerror(errno));

			close(socketfd);

			continue;
		}
		break;
	}

	if (p == NULL) {
		fprintf(stderr, "db-server: failed to bind: %s\n", PORT);
		exit(1);
	}

	freeaddrinfo(ai);

        option.table  = 256;
        option.bucket = 256;
        option.rdonly = 0;
        if (db_open(&db, dbfilename, idxfilename, &option) != DB_OK) {
                fprintf(stderr, "db-server: open db %s failed\n", dbfilename);

                exit(0);
        }

	if (listen(socketfd, 32) == -1) {
		fprintf(stderr, "db-server: listen: %s\n", strerror(errno));

		exit(1);
	}

	FD_ZERO(&readfds);
	FD_ZERO(&writefds);

	nfds = socketfd;
	FD_SET(socketfd, &readfds);

	inbuf  = malloc(INBUF_LEN);
	outbuf = malloc(OUTBUF_LEN);
	valbuf = malloc(VALBUF_LEN);

	for (;;) {
		int n;
		int fd;
		fd_set readfds_;
		fd_set writefds_;

		FD_ZERO(&readfds_);
		FD_ZERO(&writefds_);

#ifdef LINUX
		memcpy(&readfds_, &readfds, sizeof(readfds));
		memcpy(&writefds_, &writefds, sizeof(writefds));
#else
		FD_COPY(&readfds, &readfds_);
		FD_COPY(&writefds, &writefds_);
#endif

		if ((n = select(nfds + 1, &readfds_, &writefds_, NULL, NULL)) == -1) {
			fprintf(stderr, "db-server: select: %s\n", strerror(errno));

			exit(1);
		}

		for (fd = 0; fd <= nfds && n > 0; fd++) {
			if (FD_ISSET(fd, &writefds_)) {
				n--;
				handle_write(fd, &readfds, &writefds);
			}

			if (FD_ISSET(fd, &readfds_)) {
				n--;
				if (fd == socketfd) {
					int acceptfd;

					acceptfd = handle_accept(fd, &readfds, &writefds);
					if (acceptfd > nfds) {
						nfds = acceptfd;
					}
				} else {
					err = handle_read(fd, &db, &readfds, &writefds);
					if (err == -1 && fd >= nfds) {
						nfds = fd;
						while (FD_ISSET(nfds, &readfds)  == 0 &&
						       FD_ISSET(nfds, &writefds) == 0)
						{
							nfds--;
						}
					}
				}
			}
		}
	}
	free(inbuf);
	free(outbuf);
	free(valbuf);

	return 0;
}
Пример #15
0
bool TcpServer::_StartUpLin()
{
#ifndef WIN32
    int loop_times = 0;
    const int timer_check_point = 10; //达到指定循环次数即开始timer检查

	while(m_bRun) 
	{
		int res = epoll_wait(m_epoll_fd, m_epev_arr, EVENT_TOTAL_COUNT, 100);
		if ( res < 0) {
            //及时退出,否则会导致 CPU 100% 
			if (EINTR == errno)
				continue;
			log_debug("epoll_wait return false, errno = %d\n", errno);
			break;
		}
		else if (0 == res) { //timeout
            loop_times = 0;
			run_timer();
		}
        else {
            //间隔一定次数即开始检查定时器的超时事件
            if (++loop_times >= timer_check_point) {
                loop_times = 0;
                //驱动定时器处理
                run_timer();
            }
        }
		
		for(int i=0; i<res; i++)
		{
			if(m_epev_arr[i].data.fd == m_listen_fd)
			{
				handle_accept();
                continue;
			}
            int fd = (uint32_t)m_epev_arr[i].data.u64; /* mask out the lower 32 bits */
            uint32 index = (uint32_t)(m_epev_arr[i].data.u64 >> 32);
            TcpHandler* s = fds[fd];
            if( s == 0 || s->get_fd_index() != index )
            {                      
                continue;       // epoll returned invalid fd 
            }
            if( m_epev_arr[i].events & ( EPOLLHUP | EPOLLERR ))
            {    
                handle_close(s);
                continue;
            }
			else if(m_epev_arr[i].events & EPOLLIN )
			{				
                if(s->handle_read() == -1)
				{
					handle_close(s);
					continue;
				}
                if( s->Writable() )
                    WantWrite(s);
			}
			else if(m_epev_arr[i].events&EPOLLOUT)
			{
				if(s->handle_output() == -1)
				{
					handle_close(s);
					continue;
				}
                if(!s->Writable())
                    WantRead(s);
			}
		}
	}
#endif 
	return true;
}
Пример #16
0
bool TcpServer::_StartUpWin()
{
#ifdef WIN32
	struct timeval tv = {1, 000000};
	while(m_bRun)
	{
		m_tmp_rset = m_rset;
		m_tmp_wset = m_wset;
		int ready = select(m_maxfd+1, &m_tmp_rset, &m_tmp_wset, NULL, &tv);				
       
		if(ready == -1)
		{
			int err = WSAGetLastError();
			if (err != EINTR)
			{
				return false;
			}	
		}
		else if (ready == 0)	
		{
            run_timer();
			continue;
		}
		else
		{
            run_timer();

			if (FD_ISSET(m_listen_fd, &m_tmp_rset)) 
			{
				handle_accept();
				--ready;		
			}
            for (int i=0; ready > 0 && i< m_maxfd; i++)
            {
                TcpHandler* p_socket = fds[i];
                if(p_socket == NULL)
                {
                    continue;
                }                
                if(FD_ISSET(p_socket->GetFd(), &m_tmp_rset))
                {
                    --ready;
                    if (p_socket->handle_read() == -1)
                    {	
                        handle_close(p_socket);
                        continue;
                    }
                }
                if(FD_ISSET(p_socket->GetFd(), &m_tmp_wset))
                {
                    --ready;
                    if (p_socket->handle_output() == -1)
                    {
                        handle_close(p_socket);
                    }
                }
            }
		}
	}
#endif // WIN32
	return true;
}
Пример #17
0
int main(int argc, const char* argv[])
{
	struct sockaddr_in sAddr;
	struct epoll_event ev;
	struct epoll_event evlist[MAX_EVENTS];
	int ready, i;

	int listensock = 0;

	int result=0, val = 0;

	//init epoll
	if( init_epoll() ){
		exit(-1);
	}
	printf("epoll instance created success! \n");

	//create socket
	if ( -1 == (listensock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))  {
		perror("create socket error!");
		exit(1);
	}
	
	val = 1;
	result = setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &val,sizeof(val));
	if( result < 0 ){
		perror("set socket option error!");
		exit(1);
	}
	
	sAddr.sin_family = AF_INET;
	sAddr.sin_port = htons(g_server_port);
	sAddr.sin_addr.s_addr = INADDR_ANY;

	//now bind the address and port
	result = bind(listensock, (struct sockaddr*)&sAddr, sizeof(sAddr));
	if ( result < 0 ) {
		perror("bind error!");
		exit(1);
	}

	//print server ready info
	printf("Server get ready at port : %d \n", g_server_port);

	result = listen(listensock, 5);
	if( result < 0 ) {
		perror("listen error!");
		exit(1);
	}
	
	setnonblocking(listensock); //set nonblocking

	ev.events = EPOLLIN|EPOLLET; //edge-trigged
        ev.data.fd = listensock;
        if( epoll_ctl(epfd, EPOLL_CTL_ADD, listensock, &ev) == -1 ){
		perror("epoll_ctl add error!");
	        exit(-1);
	}

	//now we will epoll_wait the event
	//
	while(1) {
		//Fetch up to MAX_EVENTS items from the ready list
                //printf("About to epoll_wait() \n");
                ready = epoll_wait(epfd, evlist, MAX_EVENTS, -1);
		if( ready == -1 ){
			if( errno == EINTR ){
				printf("Get an intr signal!\n");
				continue;
			} else {
				perror("epoll_wait error!");
				exit(-1);
			}

		}

		for(i=0;i<ready;i++){
		/*	printf("fd=%d, events: %s%s%s%s \n",evlist[i].data.fd,
				(evlist[i].events & EPOLLIN)? "EPOLLIN ":"",
				(evlist[i].events & EPOLLOUT)? "EPOLLOUT ":"",
				(evlist[i].events & EPOLLHUP)? "EPOLLHUP ":"",
				(evlist[i].events & EPOLLERR)? "EPOLLERR ":"");
		*/
			//deal with events
			if( evlist[i].events & EPOLLIN ){
				if( evlist[i].data.fd == listensock ){
					handle_accept(evlist[i].data.fd);
				} else {
					handle_read(evlist[i].data.fd);
				}

			}
			else if( evlist[i].events & EPOLLOUT){
				handle_write(evlist[i].data.fd);
			}
			else if( evlist[i].events &(EPOLLHUP|EPOLLERR)){
				printf("Client on descriptor #%d disconnetcted. \n", evlist[i].data.fd);

				if( close( evlist[i].data.fd ) == -1 ){
					perror("close fd error!");
					exit(-1);
				}
			}
		}//end of for ready
	}//end of while

	return 0;

}
Пример #18
0
NET_API int
net_wait(struct net_service* service, int timeout)
{
    int ret;
    int err;
    struct iocp_data* ov_data;
    PULONG_PTR data;
    DWORD bytes;
    int cnt;

#if _WIN32_WINNT >= 0x0600
    ULONG ulCount;
    ULONG ulNR;
    ULONG i;
    OVERLAPPED_ENTRY entries[32];

    cnt = 0;

    ulCount = sizeof(entries) / sizeof(OVERLAPPED_ENTRY);
    ulNR = 0;

    ov_data = 0;
    data = 0;
    bytes = 0;
    err = 0;
    while(1)
    {
        ret = GetQueuedCompletionStatusEx(service->net_service_fd, entries, ulCount, &ulNR, timeout, 0);
        err = net_get_error();
        if (err == WAIT_TIMEOUT)
        {
            err = 0;
        }
        if (!ret)
        {
            if (err)
            {
                return -err;
            }
            return cnt;
        }

        for (i = 0; i < ulNR; ++i)
        {
            ov_data = (struct iocp_data*)entries[i].lpOverlapped;
            bytes = entries[i].dwNumberOfBytesTransferred;
            if (ov_data)
            {
                switch(ov_data->op_type)
                {
                case OP_NET_ACCEPT:
                    handle_accept(service, ret, err, (struct accept_session*)ov_data);
                    break;
                case OP_NET_READ:
                    handle_read(service, ret, err, (struct read_session*)ov_data, bytes);
                    break;
                case OP_NET_WRITE:
                    handle_write(service, ret, err, (struct write_session*)ov_data, bytes);
                    break;
                case OP_NET_CONNECT:
                    handle_connect(service, ret, err, (struct connect_session *)ov_data, bytes);
                    break;
                }
            }
        }
        cnt += (int)ulNR;
    }
    return cnt;

#else
    cnt = 0;

    while(1)
    {
        ret = GetQueuedCompletionStatus(service->net_service_fd, &bytes, (PULONG_PTR) &data, (LPOVERLAPPED*)&ov_data, timeout);
        err = 0;
        if (!ret)
        {
            err = net_get_error();
        }

        if (err == WAIT_TIMEOUT)
        {
            err = 0;
        }
        if(!ov_data)
        {
            if(err)
            {
                return -err;
            }
            return cnt;
        }
        else
        {
            switch(ov_data->op_type)
            {
            case OP_NET_ACCEPT:
                handle_accept(service, ret, err, (struct accept_session*)ov_data);
                break;
            case OP_NET_READ:
                handle_read(service, ret, err, (struct read_session*)ov_data, bytes);
                break;
            case OP_NET_WRITE:
                handle_write(service, ret, err, (struct write_session*)ov_data, bytes);
                break;
            case OP_NET_CONNECT:
                handle_connect(service, ret, err, (struct connect_session *)ov_data, bytes);
                break;
            }
        }
        cnt += 1;
    }
    return cnt;
#endif
}