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); } } }
/* * === 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 ----- */
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; }
/** 异步连接 */ 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; }