Re-transmission implemented in the uclient.

This commit is contained in:
mom040267 2014-11-09 09:22:24 +00:00
parent 8f169e62bf
commit 61947e8dbd
3 changed files with 62 additions and 16 deletions

View File

@ -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,

View File

@ -40,6 +40,8 @@
#include <openssl/err.h>
#include <openssl/rand.h>
#include <sys/select.h>
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);

View File

@ -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);