예제 #1
0
파일: CNet.cpp 프로젝트: 854825967/mylib
void CNet::CSend(const s32 nConnectID, const void * pData, const s32 nSize) {
    CConnection * pCConnection = m_ConnectPool[nConnectID];
    if (pCConnection->bShutdown) {
        return;
    }
    s32 size = pCConnection->stream.size();
    pCConnection->stream.in(pData, nSize);
    if (0 == size) {
        struct iocp_event * pEvent = malloc_event();
        ASSERT(pEvent);
        pEvent->event = EVENT_ASYNC_SEND;
        pEvent->wbuf.buf = (char *) pCConnection->stream.buff();
        pEvent->wbuf.len = nSize;
        pEvent->p = pCConnection;
        pEvent->s = pCConnection->s;
        s32 err;
        {
            CAutoLock(&(pCConnection->sdlock));
            pCConnection->nSDTags = pCConnection->nSDTags & CSD_RECV;
        }
        if (ERROR_NO_ERROR != async_send(pEvent, &err, pCConnection)) {
            //some problem in here must be killed// like 10054
            NET_DEBUG("async_send failed, err %d", err);
            SafeShutdwon(pEvent, CSD_SEND);
        }
    }

}
예제 #2
0
/*
 * ===  FUNCTION  ======================================================================
 *         Name:  push_event
 *  Description:  push a stim_event to event linked list.
 * =====================================================================================
 */
static struct stim_event* push_event ( uint16_t delayms, void (*callback)(void),uint16_t times )
{
  struct stim_event *event;

  event = malloc_event();
  event->interval = delayms;
  event->now = 0;
  event->looptimes = times;
  event->next = NULL;

  mark_list[event->addIndex] = 0;

	if(callback != NULL){
    callback_list[event->addIndex] = callback;
  }

  
  if(event_list.head == NULL){
    event_list.head = event;
    event_list.tail = event;
  }else{
    event_list.tail->next = event;
		event->prev = event_list.tail;
    event_list.tail = event;
  }

  event_list.count++;
  return event;
}		/* -----  end of static function stim_push_delay_event  ----- */
예제 #3
0
파일: cepoll.c 프로젝트: 854825967/mylib
    error_code async_listen(const char * pStrIP, s32 nPort, OUT s32 * pnError, void * pData, s32 backlog) {
        ASSERT(pStrIP != NULL && pnError != NULL);
        errno = 0;
        struct epoll_event e;
        struct cepoll_event * pEvent = NULL;
        s32 s = socket(AF_INET, SOCK_STREAM, 0);
        if (-1 == (s = socket(AF_INET, SOCK_STREAM, 0))) {
            ECHO_ERROR("socket error %d", errno);
            return false;
        }
        //把socket设置为非阻塞方式
        if (!Setnonblocking(s)) {
            ECHO_ERROR("Setnonblocking error %d", errno);
            return false;
        }

        pEvent = malloc_event();
        if (NULL == pEvent) {
            //assert(false);
            ECHO_ERROR("%s", "get cepoll_event error");
            RETURN_RES(ERROR_MALLOC_EVENT);
        }

        struct sockaddr_in addr;
        memset(&addr, 0, sizeof (addr));
        addr.sin_family = AF_INET;
        inet_aton(pStrIp, &(addr.sin_addr));
        addr.sin_port = htons(nPort);

        if (-1 == bind(s, (sockaddr *) & addr, sizeof (addr)) ||
                -1 == (listen(s, LISTEN_QUENE))) {
            Assert(false);
            return false;
        }

        struct epoll_event ev;
        ev.data.ptr = pListen;
        ev.events = EPOLLIN; // | EPOLLET;
        epoll_ctl(m_epfd, EPOLL_CTL_ADD, listenfd, &ev);

        return true;
    }
예제 #4
0
파일: cepoll.c 프로젝트: 854825967/mylib
    /** 异步连接 */
    error_code async_connect(const char * pStrIP, s32 nPort, OUT s32 * pnError, void * pData) {
        struct epoll_event e;
        struct cepoll_event * pEvent = NULL;
        s32 s = socket(AF_INET, SOCK_STREAM, 0);
        errno = 0;
        if (-1 == fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)) {
            RETURN_RES(ERROR_FCNTL);
        }

        pEvent = malloc_event();
        if (NULL == pEvent) {
            //assert(false);
            ECHO_ERROR("%s", "get cepoll_event error");
            RETURN_RES(ERROR_MALLOC_EVENT);
        }
        pEvent->s = s;
        pEvent->p = pData;
        pEvent->event = EVENT_ASYNC_CONNECT;


        e.events = EPOLLOUT | EPOLLET;
        e.data.ptr = pEvent;
        epoll_ctl(s_epfd, EPOLL_CTL_ADD, s, &e);

        if((pEvent->remote.sin_addr.s_addr = inet_addr(pStrIP)) == INADDR_NONE) {
            free_event(pEvent);
            RETURN_RES(ERROR_IP_FORMAT);
        }

        *pnError = connect(s, (struct sockaddr*)&pEvent->remote, sizeof(pEvent->remote));
        /*
        getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
        if( !error )
        {
        //OK
        }
        */
        *pnError = 100;
        return ERROR_CODE_MAX;
    }