Fixed ticket #297: Bug in handling data from peer in TURN sample application (thanks scott_lvsha)

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1300 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjnath/src/pjstun-client/client_main.c b/pjnath/src/pjstun-client/client_main.c
index 567a6b7..7395bd2 100644
--- a/pjnath/src/pjstun-client/client_main.c
+++ b/pjnath/src/pjstun-client/client_main.c
@@ -41,6 +41,7 @@
     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 @@
 
 	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 @@
 
 		} 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 @@
     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 @@
 
     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 @@
     }
 
     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 @@
     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 bbed648..6a1d5f0 100644
--- a/pjnath/src/pjstun-srv-test/turn_usage.c
+++ b/pjnath/src/pjstun-srv-test/turn_usage.c
@@ -1331,7 +1331,7 @@
      */
     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 @@
 
 
 	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);
     }
 }