Exemplo n.º 1
0
// 读tcp 连接
int SocketManager::readFromTcpConn(fd_set *r_set, char *buffer, size_t size,int nready)
{
    int ret = 0;    
    std::vector<TcpSocket *>::iterator iter2;
    for (iter2 = m_tcp_conns.begin(); iter2 != m_tcp_conns.end();) {
        TcpSocket * sock = *iter2;
        if (FD_ISSET(sock->getSocketFd(), r_set)) {               
            printf("receive from tcp conns [%d].\n", sock->getSocketFd());
            ret = sock->recvMsg(buffer, size);             
            if (ret > 0) {
                printf("buffer: %s\n", buffer);
    
                procTcpMsg(sock , buffer, size);
                
                iter2++;
            } else {
                if (ret == 0) {
                    printf("the peer close the socket\n"); 
                } else {
                    perror("read");
                }
                iter2 = m_tcp_conns.erase(iter2);
                delete sock;
            }

            if (--nready <= 0) {
                break;
            } else {
                continue;
            }
        }
    
        iter2++;
    }

    printf("readFromTcpConn nready[%d]\n", nready);
    return nready;
}
Exemplo n.º 2
0
int test_tcp_srv()
{
    int ret;
    char buf[128] = {0};

    TcpSocket tcp_srv;

    // open
    tcp_srv.open();
    tcp_srv.setReuseAddr(1);
    tcp_srv.show();

    // bind
    if (tcp_srv.bind(SocketIpv4Address("0.0.0.0", 8888)) < 0) {
        perror("bind");
        return -1;
    }
    tcp_srv.show();

    // listen
    if (tcp_srv.listen() < 0) {
        perror("listen");
        return -1;
    }
    tcp_srv.show();

    // accept    
    TcpSocket *sock = tcp_srv.accept();
    sock->show();

    while(1) {
        
        ret = sock->recvMsg(buf, sizeof(buf));

        if (ret == 0) {
            fprintf(stdout, "close the fd[%d]\n", sock->getSocketFd());
            break;
        } else if (ret < 0) {
            perror("read");
            break;
        }
        printf("ret: %d buf: %s\n", ret, buf);   
    }

    tcp_srv.close();

    return 0;
}
Exemplo n.º 3
0
int SocketManager::initSelect(fd_set *r_set, int *max_fd, struct timeval *timeout)
{
    int ipv4_fd = -1;
    int netlink_fd = -1;
    int conn_fd = -1;
    
    ipv4_fd = m_tcp_sock ? m_tcp_sock->getSocketFd() : -1;
    netlink_fd = m_nl_sock ? m_nl_sock->getSocketFd() : -1;
    *max_fd = (ipv4_fd > netlink_fd) ? ipv4_fd : netlink_fd;

    FD_ZERO(r_set);
    if (-1 != ipv4_fd) {
        FD_SET(ipv4_fd, r_set);
    }
    if (-1 != netlink_fd) {
        FD_SET(netlink_fd, r_set);
    }

    
    std::vector<TcpSocket *>::iterator iter1;
    for (iter1 = m_tcp_conns.begin(); iter1 != m_tcp_conns.end(); ++iter1)
    {
        TcpSocket * sock = *iter1;        
        conn_fd = sock ? sock->getSocketFd() : -1;         
        printf("set fd conns [%d].\n", conn_fd);

        if (-1 != conn_fd) {
            FD_SET(conn_fd, r_set);
        }
        *max_fd =  (*max_fd > conn_fd) ? *max_fd : conn_fd;
    }
    
    timeout->tv_sec = 20;

    printf("max_fd[%d]\n", *max_fd);

    return 0;
}