summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-05-25 06:11:35 +0000
committerBenny Prijono <bennylp@teluu.com>2007-05-25 06:11:35 +0000
commitc9b6cdd8343a86ed970d6a54c0620e8a79ad529a (patch)
tree5aeaa7b08492c526a34740106c65f727d8561023
parent242a332d334b6fec8de0144d209b961acc8442ff (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
-rw-r--r--pjnath/src/pjstun-client/client_main.c55
-rw-r--r--pjnath/src/pjstun-srv-test/turn_usage.c6
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);
}
}