示例#1
0
文件: tcp_utils.c 项目: Kirill380/kaa
kaa_error_t ext_tcp_utils_open_tcp_socket(kaa_fd_t *fd,
                                            const kaa_sockaddr_t *destination,
                                            kaa_socklen_t destination_size)
{
    KAA_RETURN_IF_NIL3(fd, destination, destination_size, KAA_ERR_BADPARAM);
    kaa_fd_t sock = socket(destination->sa_family, SOCK_STREAM, 0);

    int flags = lwip_fcntl(sock, F_GETFL, 0);
    if (flags < 0) {
        ext_tcp_utils_tcp_socket_close(sock);
        printf("Error getting sicket access flags\n");
        return KAA_ERR_SOCKET_ERROR;
    }

    if (lwip_fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) {
        ext_tcp_utils_tcp_socket_close(sock);
        printf("Error setting socket flags. fcntl(F_GETFL): %d\n", lwip_fcntl(sock, F_GETFL, 0));
        return KAA_ERR_SOCKET_ERROR;
    }

    if (connect(sock, destination, destination_size) && errno != EINPROGRESS) {
        ext_tcp_utils_tcp_socket_close(sock);
        printf("Error connecting to destination\n");
        return KAA_ERR_SOCKET_CONNECT_ERROR;
    }

    *fd = sock;

    return KAA_ERR_NONE;
}
示例#2
0
文件: tcp_utils.c 项目: Kirill380/kaa
kaa_error_t ext_tcp_utils_open_tcp_socket(kaa_fd_t *fd
                                        , const kaa_sockaddr_t *destination
                                        , kaa_socklen_t destination_size)
{
    KAA_RETURN_IF_NIL3(fd, destination, destination_size, KAA_ERR_BADPARAM);    

    long lNonBlocking = 1;
    int status;

    kaa_fd_t sock = socket(destination->sa_family, SOCK_STREAM, 0);
    if (sock < 0)
        return KAA_ERR_SOCKET_ERROR;

    status = setsockopt(sock, SL_SOL_SOCKET, SL_SO_NONBLOCKING,
                            &lNonBlocking, sizeof(lNonBlocking));
    if ( status < 0 ) {
        ext_tcp_utils_tcp_socket_close(sock);
        return KAA_ERR_SOCKET_ERROR;
    }

    int err = connect(sock, destination, destination_size);
    if ( (err < 0 && err != SL_EALREADY)  && errno != EINPROGRESS) {
        ext_tcp_utils_tcp_socket_close(sock);
        return KAA_ERR_SOCKET_CONNECT_ERROR;
    }

    *fd = sock;
    return KAA_ERR_NONE;
}
示例#3
0
kaa_error_t ext_tcp_utils_open_tcp_socket(kaa_fd_t *fd
                                        , const kaa_sockaddr_t *destination
                                        , kaa_socklen_t destination_size)
{
    KAA_RETURN_IF_NIL3(fd, destination, destination_size, KAA_ERR_BADPARAM);

    kaa_fd_t sock = socket(destination->sa_family, SOCK_STREAM, 0);
    if (sock < 0)
        return KAA_ERR_SOCKET_ERROR;

    int flags = fcntl(sock, F_GETFL);
    if (flags < 0) {
        ext_tcp_utils_tcp_socket_close(sock);
        return KAA_ERR_SOCKET_ERROR;
    }

    if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) {
        ext_tcp_utils_tcp_socket_close(sock);
        return KAA_ERR_SOCKET_ERROR;
    }

    if (connect(sock, destination, destination_size) && errno != EINPROGRESS) {
        ext_tcp_utils_tcp_socket_close(sock);
        return KAA_ERR_SOCKET_CONNECT_ERROR;
    }

    *fd = sock;
    return KAA_ERR_NONE;
}