summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjsip-apps/src/symbian_ua/ua.cpp18
-rw-r--r--pjsip/src/pjsip/sip_transport_tcp.c40
2 files changed, 37 insertions, 21 deletions
diff --git a/pjsip-apps/src/symbian_ua/ua.cpp b/pjsip-apps/src/symbian_ua/ua.cpp
index 033a2f2a..2b36b709 100644
--- a/pjsip-apps/src/symbian_ua/ua.cpp
+++ b/pjsip-apps/src/symbian_ua/ua.cpp
@@ -51,6 +51,10 @@
#define SIP_PROXY NULL
//#define SIP_PROXY "<sip:192.168.0.8;lr>"
+//
+// Set to 1 if TCP is desired (experimental)
+//
+#define ENABLE_SIP_TCP 0
//
// Configure nameserver if DNS SRV is to be used with both SIP
@@ -378,11 +382,23 @@ static pj_status_t app_startup()
tcfg.port = SIP_PORT;
status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &tcfg, &tid);
if (status != PJ_SUCCESS) {
- pjsua_perror(THIS_FILE, "Error creating transport", status);
+ pjsua_perror(THIS_FILE, "Error creating UDP transport", status);
pjsua_destroy();
return status;
}
+ /* Add TCP transport */
+#if ENABLE_SIP_TCP
+ pjsua_transport_config_default(&tcfg);
+ tcfg.port = SIP_PORT;
+ status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcfg, &tid);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Error creating TCP transport", status);
+ pjsua_destroy();
+ return status;
+ }
+#endif
+
/* Add account for the transport */
pjsua_acc_add_local(tid, PJ_TRUE, &g_acc_id);
diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c
index a9b3bd27..1692459a 100644
--- a/pjsip/src/pjsip/sip_transport_tcp.c
+++ b/pjsip/src/pjsip/sip_transport_tcp.c
@@ -805,33 +805,33 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
status = pj_activesock_start_connect(tcp->asock, tcp->base.pool, rem_addr,
sizeof(pj_sockaddr_in));
if (status == PJ_SUCCESS) {
- tcp->has_pending_connect = PJ_FALSE;
+ on_connect_complete(tcp->asock, PJ_SUCCESS);
} else if (status != PJ_EPENDING) {
tcp_destroy(&tcp->base, status);
return status;
}
- /* Update (again) local address, just in case local address currently
- * set is different now that asynchronous connect() is started.
- */
- addr_len = sizeof(pj_sockaddr_in);
- if (pj_sock_getsockname(sock, &local_addr, &addr_len)==PJ_SUCCESS) {
- pj_sockaddr_in *tp_addr = (pj_sockaddr_in*)&tcp->base.local_addr;
-
- /* Some systems (like old Win32 perhaps) may not set local address
- * properly before socket is fully connected.
+ if (tcp->has_pending_connect) {
+ /* Update (again) local address, just in case local address currently
+ * set is different now that asynchronous connect() is started.
*/
- if (tp_addr->sin_addr.s_addr != local_addr.sin_addr.s_addr &&
- local_addr.sin_addr.s_addr != 0)
- {
- tp_addr->sin_addr.s_addr = local_addr.sin_addr.s_addr;
- tp_addr->sin_port = local_addr.sin_port;
- sockaddr_to_host_port(tcp->base.pool, &tcp->base.local_name,
- &local_addr);
- }
- }
+ addr_len = sizeof(pj_sockaddr_in);
+ if (pj_sock_getsockname(sock, &local_addr, &addr_len)==PJ_SUCCESS) {
+ pj_sockaddr_in *tp_addr = (pj_sockaddr_in*)&tcp->base.local_addr;
- if (tcp->has_pending_connect) {
+ /* Some systems (like old Win32 perhaps) may not set local address
+ * properly before socket is fully connected.
+ */
+ if (tp_addr->sin_addr.s_addr != local_addr.sin_addr.s_addr &&
+ local_addr.sin_addr.s_addr != 0)
+ {
+ tp_addr->sin_addr.s_addr = local_addr.sin_addr.s_addr;
+ tp_addr->sin_port = local_addr.sin_port;
+ sockaddr_to_host_port(tcp->base.pool, &tcp->base.local_name,
+ &local_addr);
+ }
+ }
+
PJ_LOG(4,(tcp->base.obj_name,
"TCP transport %.*s:%d is connecting to %.*s:%d...",
(int)tcp->base.local_name.host.slen,