Beispiel #1
0
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;
}
Beispiel #2
0
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
}
Beispiel #3
0
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;
}
Beispiel #4
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;
}   
Beispiel #5
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;
}
Beispiel #6
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;
}
Beispiel #7
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;
}