diff --git a/src/apps/uclient/startuclient.c b/src/apps/uclient/startuclient.c index 6b0b9c1..afe0b66 100644 --- a/src/apps/uclient/startuclient.c +++ b/src/apps/uclient/startuclient.c @@ -419,7 +419,7 @@ static int clnet_allocate(int verbose, int allocate_received = 0; while (!allocate_received) { - int len = recv_buffer(clnet_info, &response_message, 1, NULL, &request_message); + int len = recv_buffer(clnet_info, &response_message, 1, 0, NULL, &request_message); if (len > 0) { if (verbose) { @@ -673,10 +673,10 @@ static int clnet_allocate(int verbose, int refresh_received = 0; while (!refresh_received) { - int len = recv_buffer(clnet_info, &response_message, 1, 0, &request_message); + int len = recv_buffer(clnet_info, &response_message, 1, 0, NULL, &request_message); if(clnet_info->s_mobile_id[0]) { - len = recv_buffer(clnet_info, &response_message, 1, 0, &request_message); + len = recv_buffer(clnet_info, &response_message, 1, 0, NULL, &request_message); } if (len > 0) { @@ -770,7 +770,7 @@ static int turn_channel_bind(int verbose, uint16_t *chn, int cb_received = 0; while (!cb_received) { - int len = recv_buffer(clnet_info, &response_message, 1, NULL, &request_message); + int len = recv_buffer(clnet_info, &response_message, 1, 0, NULL, &request_message); if (len > 0) { if (verbose) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, @@ -879,7 +879,7 @@ static int turn_create_permission(int verbose, app_ur_conn_info *clnet_info, int cp_received = 0; while (!cp_received) { - int len = recv_buffer(clnet_info, &response_message, 1, NULL, &request_message); + int len = recv_buffer(clnet_info, &response_message, 1, 0, NULL, &request_message); if (len > 0) { if (verbose) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, @@ -1456,7 +1456,7 @@ static int turn_tcp_connection_bind(int verbose, app_ur_conn_info *clnet_info, a int cb_received = 0; while (!cb_received) { - int len = recv_buffer(clnet_info, &response_message, 1, atc, &request_message); + int len = recv_buffer(clnet_info, &response_message, 1, 1, atc, &request_message); if (len > 0) { if (verbose) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, diff --git a/src/apps/uclient/uclient.c b/src/apps/uclient/uclient.c index 6b3010f..1ba6519 100644 --- a/src/apps/uclient/uclient.c +++ b/src/apps/uclient/uclient.c @@ -40,6 +40,8 @@ #include #include +#include + static int verbose_packets=0; static size_t current_clients_number = 0; @@ -69,6 +71,8 @@ static app_ur_session** elems = NULL; #define SLEEP_INTERVAL (234) +#define MAX_LISTENING_CYCLE_NUMBER (7) + int RTP_PACKET_INTERVAL = 20; static inline s64bits time_minus(u64bits t1, u64bits t2) { @@ -302,7 +306,33 @@ int send_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int data_con return ret; } -int recv_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int sync, app_tcp_conn_info *atc, stun_buffer* request_message) { +static int wait_fd(int fd, unsigned int cycle) { + + fd_set fds; + FD_ZERO(&fds); + FD_SET(fd,&fds); + + if(dos && cycle==0) + return 0; + + struct timeval timeout = {0,0}; + if(cycle == 0) + timeout.tv_usec = 500000; + else { + timeout.tv_sec = 1; + while(--cycle) timeout.tv_sec = timeout.tv_sec + timeout.tv_sec; + } + + int rc = 0; + + do { + rc = select(fd+1,&fds,NULL,NULL,&timeout); + } while((rc<0) && (errno == EINTR)); + + return rc; +} + +int recv_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int sync, int data_connection, app_tcp_conn_info *atc, stun_buffer* request_message) { int rc = 0; @@ -324,6 +354,22 @@ int recv_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int sync, ap recv_again: + if(!use_tcp && sync && request_message && (fd>=0)) { + + unsigned int cycle = 0; + while(cycle < MAX_LISTENING_CYCLE_NUMBER) { + int serc = wait_fd(fd,cycle); + if(serc>0) + break; + if(serc<0) { + return -1; + } + if(send_buffer(clnet_info, request_message, data_connection, atc)<=0) + return -1; + ++cycle; + } + } + if (!use_secure && !use_tcp && fd >= 0) { /* Plain UDP */ @@ -586,7 +632,7 @@ static int client_read(app_ur_session *elem, int is_tcp_data, app_tcp_conn_info TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "before read ...\n"); } - rc = recv_buffer(clnet_info, &(elem->in_buffer), 0, atc, NULL); + rc = recv_buffer(clnet_info, &(elem->in_buffer), 0, is_tcp_data, atc, NULL); if (clnet_verbose && verbose_packets) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "read %d bytes\n", (int) rc); @@ -890,13 +936,13 @@ void client_input_handler(evutil_socket_t fd, short what, void* arg) { if(elem->pinfo.tcp_conn) { int i = 0; for(i=0;i<(int)(elem->pinfo.tcp_conn_number);++i) { - if(elem->pinfo.tcp_conn[i]) { - if((fd==elem->pinfo.tcp_conn[i]->tcp_data_fd) && (elem->pinfo.tcp_conn[i]->tcp_data_bound)) { - is_tcp_data = 1; - atc = elem->pinfo.tcp_conn[i]; - break; - } - } + if(elem->pinfo.tcp_conn[i]) { + if((fd==elem->pinfo.tcp_conn[i]->tcp_data_fd) && (elem->pinfo.tcp_conn[i]->tcp_data_bound)) { + is_tcp_data = 1; + atc = elem->pinfo.tcp_conn[i]; + break; + } + } } } int rc = client_read(elem, is_tcp_data, atc); diff --git a/src/apps/uclient/uclient.h b/src/apps/uclient/uclient.h index d053afc..43ff021 100644 --- a/src/apps/uclient/uclient.h +++ b/src/apps/uclient/uclient.h @@ -99,7 +99,7 @@ void start_mclient(const char *remote_address, int port, int messagenumber, int mclient); int send_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int data_connection, app_tcp_conn_info *atc); -int recv_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int sync, app_tcp_conn_info *atc, stun_buffer* request_message); +int recv_buffer(app_ur_conn_info *clnet_info, stun_buffer* message, int sync, int data_connection, app_tcp_conn_info *atc, stun_buffer* request_message); void client_input_handler(evutil_socket_t fd, short what, void* arg);