void comm_fd_isset(COMM_MANAGER_S *pCommCtx) { int new_skt = -1; struct sockaddr_in from_addr; socklen_t addr_len = (socklen_t)sizeof(struct sockaddr_in); // process last req. comm_client_process(pCommCtx); // check new connect. if (FD_ISSET(pCommCtx->socket_fd, &pCommCtx->FdSet)) { new_skt = accept(pCommCtx->socket_fd, (struct sockaddr *)&from_addr, &addr_len); printf("New: %d [%s]\n", new_skt, inet_ntoa(from_addr.sin_addr)); if (new_skt >= 0) { if (comm_accept_handle(pCommCtx, new_skt, &from_addr) < 0) { printf("comm_accept_handle is failed.\n"); handle_disconnection(&new_skt); } } else { printf("accept failed.[%m]\n"); } } }
int __comm_recv_callback(void *pkey, void *pdata, void *puserdata) { if (NULL == pkey || NULL == pdata || NULL == puserdata) { printf("__comm_recv_callback param is invalid.\n"); return -1; } int nRet = 0; COMM_MANAGER_S *pCommCtx = (COMM_MANAGER_S *)puserdata; struct LIST_TCP_REQ *pCurConnect = (struct LIST_TCP_REQ *)pdata; if (pCurConnect->Skt >= 0) { comm_dump_client(pCurConnect); if (FD_ISSET(pCurConnect->Skt, &pCommCtx->FdSet)) { nRet = comm_tcp_recv(pCommCtx, pCurConnect); if (nRet <= 0) { printf("comm_tcp_recv failed. Idx: %d, Skt: %d, recv:%d\n", pCurConnect->Idx, pCurConnect->Skt, nRet); //close socket. handle_disconnection(&pCurConnect->Skt); //remove connect client. comm_linklist_remove(pCommCtx->client_mgr_handle, pCurConnect->Idx); } } } return 0; }
void server_core::handle_connction_message(void) { message receiving; stringstream ss; string parse, gname, guip, gmip; cn->get_message(receiving); handle_disconnection(); if(receiving.type!=unicast_message_type && receiving.type!=multicast_ip_intro_type) return ; if(receiving.destination_ip!=unicast_ip) { cout<<"log: a new message got but not for me.\n"; return ; } ss<<receiving.body; if(receiving.type==multicast_ip_intro_type) { ss>>gname>>guip>>gmip; if(name2unicast.find(gname)!=name2unicast.end()) { cout<<"log: duplicate group registeration, discarded.\n"; return ; } name2unicast[gname]=guip; name2multicast[gname]=gmip; cout<<"log: successfully registered group. name: "<<gname<<" uip: "<<guip<<" mip: "<<gmip<<endl; }
int comm_client_process(COMM_MANAGER_S *pCommCtx) { int nRet = 0; struct LIST_TCP_REQ *p_cur = pCommCtx->TcpReqHead; struct LIST_TCP_REQ *p_next = NULL; struct LIST_TCP_REQ *p_prev = NULL; while (p_cur) { p_next = p_cur->Next; if (-1 != p_cur->Skt) { if (FD_ISSET(p_cur->Skt, &pCommCtx->FdSet)) { nRet = comm_tcp_recv(pCommCtx, p_cur); if (nRet <= 0) { printf("comm_tcp_recv failed. Idx: %d, Skt: %d, recv:%d\n",p_cur->Idx, p_cur->Skt, nRet); handle_disconnection(&p_cur->Skt); pCommCtx->ListTcpReq[p_cur->Idx] = NULL; set_invalid_sink_id(p_cur->Idx); free(p_cur); p_cur = NULL; if(NULL == p_prev) { pCommCtx->TcpReqHead = p_next; } else { p_prev->Next = p_next; } pCommCtx->TcpReqCnt--; } } } p_prev = p_cur; p_cur = p_next; } comm_dump_list_req(pCommCtx); return 0; }