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; }
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; }
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; }