static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) { aeApiState *state = (aeApiState*)eventLoop->apidata; int retval = 0, j, numevents = 0; memcpy(&state->_rfds,&state->rfds,sizeof(fd_set)); memcpy(&state->_wfds,&state->wfds,sizeof(fd_set)); retval = select(eventLoop->maxfd+1, &state->_rfds,&state->_wfds,NULL,tvp); if (retval > 0) { for (j = 0; j <= eventLoop->maxfd; j++) { int mask = 0; aeFileEvent *fe = &eventLoop->events[j]; if (fe->mask == AE_NONE) continue; #ifndef WIN32 if (fe->mask & AE_READABLE && FD_ISSET(j,&state->_rfds)) mask |= AE_READABLE; if (fe->mask & AE_WRITABLE && FD_ISSET(j,&state->_wfds)) mask |= AE_WRITABLE; #else if (fe->mask & AE_READABLE && FD_ISSET(EV_FD_TO_WIN32_HANDLE(j),&state->_rfds)) mask |= AE_READABLE; if (fe->mask & AE_WRITABLE && FD_ISSET(EV_FD_TO_WIN32_HANDLE(j),&state->_wfds)) mask |= AE_WRITABLE; #endif eventLoop->fired[numevents].fd = j; eventLoop->fired[numevents].mask = mask; numevents++; } } return numevents; }
static void aeApiDelEvent(aeEventLoop *eventLoop, fd_t fd, int mask) { aeApiState *state = (aeApiState*)eventLoop->apidata; #ifndef WIN32 if (mask & AE_READABLE) FD_CLR(fd,&state->rfds); if (mask & AE_WRITABLE) FD_CLR(fd,&state->wfds); #else if (mask & AE_READABLE) FD_CLR((SOCKET)EV_FD_TO_WIN32_HANDLE(fd),&state->rfds); if (mask & AE_WRITABLE) FD_CLR((SOCKET)EV_FD_TO_WIN32_HANDLE(fd),&state->wfds); #endif }
static int aeApiAddEvent(aeEventLoop *eventLoop, fd_t fd, int mask) { aeApiState *state = (aeApiState*)eventLoop->apidata; #ifndef WIN32 if (mask & AE_READABLE) FD_SET(fd,&state->rfds); if (mask & AE_WRITABLE) FD_SET(fd,&state->wfds); #else #define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle(fd) #define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle(handle, 0) if (mask & AE_READABLE) FD_SET((SOCKET)EV_FD_TO_WIN32_HANDLE(fd),&state->rfds); if (mask & AE_WRITABLE) FD_SET((SOCKET)EV_FD_TO_WIN32_HANDLE(fd),&state->wfds); #endif return 0; }
int aesocaccept(fd_t s, fd_t *sa, unsigned int *ip, unsigned short *port) { SOCKET socket = EV_FD_TO_WIN32_HANDLE(s); SOCKET sockConn = INVALID_SOCKET; SOCKADDR_IN addrIn; int len = sizeof(SOCKADDR); sockConn = accept(socket, (SOCKADDR*)&addrIn, &len); if(INVALID_SOCKET == sockConn) { return _wouldblock; } if(SOCKET_ERROR == sockConn){ return (WSAGetLastError()==WSAEWOULDBLOCK) ? _wouldblock : (-1); } if(!aesocnoblock(sockConn)){ closesocket(sockConn); return (-1); } if(ip){ *ip = addrIn.sin_addr.s_addr; } if(port){ *port = ntohs(addrIn.sin_port); } *sa = EV_WIN32_HANDLE_TO_FD(sockConn); return 0; }
int aesocconnect(fd_t iSocket, unsigned int ip, unsigned short port) { SOCKET socket = EV_FD_TO_WIN32_HANDLE(iSocket); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(ip); if(SOCKET_ERROR==connect(socket,(const struct sockaddr*)&addr,sizeof(addr))){ if(WSAEWOULDBLOCK!=WSAGetLastError()){ return (-1); } } return 0; }
int aesoclisten(fd_t s, unsigned short usPort) { SOCKET socket = EV_FD_TO_WIN32_HANDLE(s); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(usPort); if(SOCKET_ERROR==bind(socket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))){ return (-1); } if(SOCKET_ERROR==listen(socket, SOMAXCONN)){ return (-1); } return 0; }
int aesocread(fd_t s, char *pszBuff, int iLen) { SOCKET socket = EV_FD_TO_WIN32_HANDLE(s); int ret = 0; if(0 >= iLen){ return 0; } ret = recv(socket, pszBuff, iLen, 0); if(SOCKET_ERROR == ret){ if(WSAEWOULDBLOCK!=WSAGetLastError()){ return (-1); } return 0; } return (0>=ret)?0:ret; }