Esempio n. 1
0
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");
        }
    }
}
Esempio n. 2
0
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;
}
Esempio n. 3
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;
	}
Esempio n. 4
0
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;
}