linux 下建立异步链接

阅读更多
int32_t SockEndPoint::connect_server()
{
	struct sockaddr_in client_addr;
    int sock_ret = 0;
    bzero(&client_addr, sizeof(client_addr) );
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = htons(INADDR_ANY);
    client_addr.sin_port = htons(0);    

    client_socket_ = socket( AF_INET, SOCK_STREAM, 0);
    if ( client_socket_ < 0)
    {
        LOGV(LL_ERROR, "Create Socket Failed!\n" );
        return -1;
    }
    /*
    if ( bind( client_socket_ , (struct sockaddr*)&client_addr, sizeof(client_addr)))
    {
        LOGV(LL_ERROR, "Client Bind Port Failed!\n" ); 
        return -2;
    }*/
    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    if (inet_aton(addr_.c_str() , &server_addr.sin_addr) == 0)
    {
        LOGV(LL_ERROR, "Server IP Address Error!\n" );
        return -3;
    }

    int flags = 0,error = 0;
    socklen_t len;
    flags = fcntl( client_socket_, F_GETFL, 0);
    fcntl(client_socket_, F_SETFL, flags | O_NONBLOCK);
	
    server_addr.sin_port = htons( port_ );
    socklen_t server_addr_length = sizeof(server_addr);
 
    if ( (sock_ret = connect(client_socket_, (struct sockaddr*)&server_addr, server_addr_length)) < 0)
    {
        if ( errno != EINPROGRESS )
            return -1;
    }
    if( sock_ret == 0 )
    {
        LOGV(LL_INFO, "local connect To %s:%d ok!\n", addr_.c_str() , port_ );
    }

    FD_ZERO(&rdfds);
    FD_SET( client_socket_ , &rdfds);
    wdfds = rdfds;
    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    sock_ret = select( client_socket_ + 1, &rdfds, &wdfds , NULL, &tv);
    if ( sock_ret <= 0 )
    {
        LOGV(LL_ERROR, "select error  or timeout !");
        close(client_socket_);
        return -1;
    }
    if (/* FD_ISSET(client_socket_, &rdfds) ||*/ FD_ISSET(client_socket_, &wdfds) )
    {
        if ( FD_ISSET(client_socket_, &rdfds) )
        {
            LOGV(LL_ERROR, "socket refuse !");
            close(client_socket_);
            return -1;
        }
        if ( getsockopt(client_socket_, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
        {
            if ( error )
            {
                LOGV(LL_ERROR, "Can not connect To %s:%d refuse,error %d msg %s !\n", 
                     addr_.c_str() , port_, error, strerror(error) );
                return -4;
            }
        }
        else 
        {
            LOGV(LL_INFO, "connect To %s:%d ok!\n", addr_.c_str() , port_ );
            connect_status_ = 1;
        }
    }else
    {
        LOGV(LL_ERROR, "Can not connect To %s:%d timeout!\n", addr_.c_str() , port_ );
        close(client_socket_);
        return -1;
    }

    printf("trace %d %d\n", client_socket_, sock_ret );
    fcntl(client_socket_, F_SETFL, flags);
 
    return 0;
}

 

你可能感兴趣的:(linux 下建立异步链接)