summaryrefslogtreecommitdiff
path: root/pjlib-util/src/pjstun-client/client_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjlib-util/src/pjstun-client/client_main.c')
-rw-r--r--pjlib-util/src/pjstun-client/client_main.c136
1 files changed, 135 insertions, 1 deletions
diff --git a/pjlib-util/src/pjstun-client/client_main.c b/pjlib-util/src/pjstun-client/client_main.c
index 7dc0540d..5f9d7d4c 100644
--- a/pjlib-util/src/pjstun-client/client_main.c
+++ b/pjlib-util/src/pjstun-client/client_main.c
@@ -18,8 +18,142 @@
*/
#include <pjlib-util.h>
#include <pjlib.h>
+#include "stun_session.h"
+
+#include <conio.h>
#define THIS_FILE "client_main.c"
-#define MAX_THREADS 8
+
+
+static my_perror(const char *title, pj_status_t status)
+{
+ char errmsg[PJ_ERR_MSG_SIZE];
+ pj_strerror(status, errmsg, sizeof(errmsg));
+
+ PJ_LOG(3,(THIS_FILE, "%s: %s", title, errmsg));
+}
+
+static pj_status_t on_send_msg(pj_stun_tx_data *tdata,
+ const void *pkt,
+ pj_size_t pkt_size,
+ unsigned addr_len,
+ const pj_sockaddr_t *dst_addr)
+{
+ pj_sock_t sock;
+ pj_ssize_t len;
+ pj_status_t status;
+
+ sock = (pj_sock_t) pj_stun_session_get_user_data(tdata->sess);
+
+ len = pkt_size;
+ status = pj_sock_sendto(sock, pkt, &len, 0, dst_addr, addr_len);
+
+ if (status != PJ_SUCCESS)
+ my_perror("Error sending packet", status);
+
+ return status;
+}
+
+static void on_bind_response(pj_stun_session *sess,
+ pj_status_t status,
+ pj_stun_tx_data *request,
+ const pj_stun_msg *response)
+{
+ my_perror("on_bind_response()", status);
+}
+
+int main()
+{
+ pj_stun_endpoint *endpt = NULL;
+ pj_pool_t *pool = NULL;
+ pj_caching_pool cp;
+ pj_timer_heap_t *th = NULL;
+ pj_stun_session *sess;
+ pj_sock_t sock = PJ_INVALID_SOCKET;
+ pj_sockaddr_in addr;
+ pj_stun_session_cb stun_cb;
+ pj_stun_tx_data *tdata;
+ pj_str_t s;
+ pj_status_t status;
+
+ status = pj_init();
+ status = pjlib_util_init();
+
+ pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
+
+ pool = pj_pool_create(&cp.factory, NULL, 1000, 1000, NULL);
+
+ status = pj_timer_heap_create(pool, 1000, &th);
+ pj_assert(status == PJ_SUCCESS);
+
+ status = pj_stun_endpoint_create(&cp.factory, 0, NULL, th, &endpt);
+ pj_assert(status == PJ_SUCCESS);
+
+ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock);
+ pj_assert(status == PJ_SUCCESS);
+
+ status = pj_sockaddr_in_init(&addr, pj_cstr(&s, "127.0.0.1"), PJ_STUN_PORT);
+ pj_assert(status == PJ_SUCCESS);
+
+ pj_memset(&stun_cb, 0, sizeof(stun_cb));
+ stun_cb.on_send_msg = &on_send_msg;
+ stun_cb.on_bind_response = &on_bind_response;
+
+ status = pj_stun_session_create(endpt, NULL, &stun_cb, &sess);
+ pj_assert(status == PJ_SUCCESS);
+
+ pj_stun_session_set_user_data(sess, (void*)sock);
+
+ status = pj_stun_session_create_bind_req(sess, &tdata);
+ pj_assert(status == PJ_SUCCESS);
+
+ status = pj_stun_session_send_msg(sess, 0, sizeof(addr), &addr, tdata);
+ pj_assert(status == PJ_SUCCESS);
+
+ while (1) {
+ pj_fd_set_t rset;
+ int n;
+ pj_time_val timeout;
+
+ if (kbhit()) {
+ if (_getch()==27)
+ break;
+ }
+
+ PJ_FD_ZERO(&rset);
+ PJ_FD_SET(sock, &rset);
+
+ timeout.sec = 0; timeout.msec = 100;
+
+ n = pj_sock_select(FD_SETSIZE, &rset, NULL, NULL, &timeout);
+
+ if (PJ_FD_ISSET(sock, &rset)) {
+ char pkt[512];
+ pj_ssize_t len;
+
+ len = sizeof(pkt);
+ status = pj_sock_recv(sock, pkt, &len, 0);
+ if (status == PJ_SUCCESS) {
+ pj_stun_session_on_rx_pkt(sess, pkt, len, NULL);
+ }
+ }
+
+ pj_timer_heap_poll(th, NULL);
+ }
+
+on_return:
+ if (sock != PJ_INVALID_SOCKET)
+ pj_sock_close(sock);
+ if (endpt)
+ pj_stun_endpoint_destroy(endpt);
+ if (th)
+ pj_timer_heap_destroy(th);
+ if (pool)
+ pj_pool_release(pool);
+ pj_caching_pool_destroy(&cp);
+
+ return 0;
+}
+