diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-05-25 06:11:35 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-05-25 06:11:35 +0000 |
commit | c9b6cdd8343a86ed970d6a54c0620e8a79ad529a (patch) | |
tree | 5aeaa7b08492c526a34740106c65f727d8561023 /pjnath/src | |
parent | 242a332d334b6fec8de0144d209b961acc8442ff (diff) |
Fixed ticket #297: Bug in handling data from peer in TURN sample application (thanks scott_lvsha)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1300 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath/src')
-rw-r--r-- | pjnath/src/pjstun-client/client_main.c | 55 | ||||
-rw-r--r-- | pjnath/src/pjstun-srv-test/turn_usage.c | 6 |
2 files changed, 54 insertions, 7 deletions
diff --git a/pjnath/src/pjstun-client/client_main.c b/pjnath/src/pjstun-client/client_main.c index 567a6b75..7395bd2b 100644 --- a/pjnath/src/pjstun-client/client_main.c +++ b/pjnath/src/pjstun-client/client_main.c @@ -41,6 +41,7 @@ static struct global pj_timer_heap_t *th; pj_stun_session *sess; pj_sock_t sock; + pj_sock_t peer_sock; pj_thread_t *thread; pj_bool_t quit; pj_sockaddr_in peer_addr; @@ -154,8 +155,10 @@ static int worker_thread(void *unused) PJ_FD_ZERO(&readset); PJ_FD_SET(g.sock, &readset); + PJ_FD_SET(g.peer_sock, &readset); - n = pj_sock_select(g.sock+1, &readset, NULL, NULL, &timeout); + n = (g.peer_sock > g.sock) ? g.peer_sock : g.sock; + n = pj_sock_select(n+1, &readset, NULL, NULL, &timeout); if (n > 0) { if (PJ_FD_ISSET(g.sock, &readset)) { pj_uint8_t buffer[512]; @@ -179,9 +182,43 @@ static int worker_thread(void *unused) } else { buffer[len] = '\0'; - PJ_LOG(3,(THIS_FILE, "Received data: %s", (char*)buffer)); + PJ_LOG(3,(THIS_FILE, "Received data on client sock: %s", (char*)buffer)); } + + } else if (PJ_FD_ISSET(g.peer_sock, &readset)) { + pj_uint8_t buffer[512]; + pj_ssize_t len; + pj_sockaddr_in addr; + int addrlen; + pj_status_t rc; + + len = sizeof(buffer); + addrlen = sizeof(addr); + rc = pj_sock_recvfrom(g.peer_sock, buffer, &len, 0, &addr, &addrlen); + if (rc != PJ_SUCCESS || len <= 0) + continue; + + buffer[len] = '\0'; + + if (pj_stun_msg_check(buffer, len, PJ_STUN_IS_DATAGRAM)==PJ_SUCCESS) { + pj_stun_msg *msg; + + rc = pj_stun_msg_decode(g.pool, (pj_uint8_t*)buffer, len, 0, + &msg, NULL, NULL); + if (rc != PJ_SUCCESS) { + my_perror("Error decoding packet on peer sock", rc); + } else { + pj_stun_msg_dump(msg, buffer, sizeof(buffer), NULL); + PJ_LOG(3,(THIS_FILE, "Received STUN packet on peer sock: %s", + buffer)); + } + + } else { + PJ_LOG(3,(THIS_FILE, "Received data on peer sock: %s", (char*)buffer)); + } + } + } else if (n < 0) pj_thread_sleep(50); } @@ -233,6 +270,12 @@ static int init() pj_stun_config_init(&g.stun_config, &g.cp.factory, 0, NULL, g.th); pj_assert(status == PJ_SUCCESS); + status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &g.peer_sock); + pj_assert(status == PJ_SUCCESS); + + status = pj_sock_bind_in(g.peer_sock, 0, 0); + pj_assert(status == PJ_SUCCESS); + status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &g.sock); pj_assert(status == PJ_SUCCESS); @@ -249,10 +292,13 @@ static int init() PJ_LOG(3,(THIS_FILE, "Listening on port %d", (int)pj_ntohs(addr.sin_port))); - pj_memcpy(&g.peer_addr, &addr, sizeof(pj_sockaddr_in)); + len = sizeof(g.peer_addr); + status = pj_sock_getsockname(g.peer_sock, &g.peer_addr, &len); if (g.peer_addr.sin_addr.s_addr == 0) pj_gethostip(&g.peer_addr.sin_addr); + PJ_LOG(3,(THIS_FILE, "Peer is on port %d", (int)pj_ntohs(g.peer_addr.sin_port))); + pj_memset(&stun_cb, 0, sizeof(stun_cb)); stun_cb.on_send_msg = &on_send_msg; stun_cb.on_request_complete = &on_request_complete; @@ -487,7 +533,7 @@ static void send_raw_data_to_relay(void) } len = strlen(g.data); - pj_sock_sendto(g.sock, g.data, &len, 0, &g.relay_addr, sizeof(g.relay_addr)); + pj_sock_sendto(g.peer_sock, g.data, &len, 0, &g.relay_addr, sizeof(g.relay_addr)); } static pj_status_t parse_addr(const char *input, @@ -644,6 +690,7 @@ int main(int argc, char *argv[]) pj_status_t status; g.data = g.data_buf; + pj_ansi_strcpy(g.data, "Hello world"); while((c=pj_getopt_long(argc,argv, "r:u:p:N:hF", long_options, &opt_id))!=-1) { switch (c) { diff --git a/pjnath/src/pjstun-srv-test/turn_usage.c b/pjnath/src/pjstun-srv-test/turn_usage.c index bbed6480..6a1d5f0f 100644 --- a/pjnath/src/pjstun-srv-test/turn_usage.c +++ b/pjnath/src/pjstun-srv-test/turn_usage.c @@ -1331,7 +1331,7 @@ static void client_handle_peer_data(struct turn_client *client, */ if (peer == client->active_peer && !has_magic_cookie) { pj_stun_usage_sendto(client->tu->usage, client->pkt, bytes_read, 0, - &client->pkt_src_addr, client->pkt_src_addr_len); + &client->client_src_addr, sizeof(pj_sockaddr_in)); } else { /* Otherwise wrap in Data Indication */ pj_stun_tx_data *data_ind; @@ -1352,8 +1352,8 @@ static void client_handle_peer_data(struct turn_client *client, pj_stun_session_send_msg(client->session, PJ_FALSE, - &client->pkt_src_addr, - client->pkt_src_addr_len, + &client->client_src_addr, + sizeof(pj_sockaddr_in), data_ind); } } |