📄 exconf.c
字号:
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot create socket!\n", strerror (errno)));#endif
continue; } if (eXosip.http_port) { break; } if (curinfo->ai_family == AF_INET6) {#ifdef IPV6_V6ONLY if (setsockopt_ipv6only (sock)) { close (sock); sock = -1; OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot set socket option!\n", strerror (errno))); continue; }#endif /* IPV6_V6ONLY */ } res = bind (sock, curinfo->ai_addr, curinfo->ai_addrlen); if (res < 0) {#if !defined(_WIN32_WCE)
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot bind socket node:%s family:%d %s\n", node, curinfo->ai_family, strerror (errno)));#endif
close (sock); sock = -1; continue; } len = sizeof (net_int->ai_addr); res = getsockname (sock, (struct sockaddr *) &net_int->ai_addr, &len); if (res != 0) {#if !defined(_WIN32_WCE)
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot get socket name (%s)\n", strerror (errno)));#endif
memcpy (&net_int->ai_addr, curinfo->ai_addr, curinfo->ai_addrlen); } if (transport != IPPROTO_UDP) { res = listen (sock, SOMAXCONN); if (res < 0) {#if !defined(_WIN32_WCE)
OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot bind socket node:%s family:%d %s\n", node, curinfo->ai_family, strerror (errno)));#endif
close (sock); sock = -1; continue; } } break; } freeaddrinfo (addrinfo); if (sock < 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot bind on port: %i\n", port)); return -1; } if (eXosip.http_port) net_int->net_protocol = IPPROTO_UDP; else net_int->net_protocol = transport; net_int->net_socket = sock; if (port == 0) { /* get port number from socket */ if (ipv6_enable == 0) port = ntohs (((struct sockaddr_in *) &net_int->ai_addr)->sin_port); else port = ntohs (((struct sockaddr_in6 *) &net_int->ai_addr)->sin6_port); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: Binding on port %i!\n", port)); } snprintf (net_int->net_port, sizeof (net_int->net_port) - 1, "%i", port); if (eXosip.http_port) { /* only ipv4 */ struct sockaddr_in _addr; char http_req[2048]; char http_reply[2048]; int len; _addr.sin_port = (unsigned short) htons (eXosip.http_port); _addr.sin_addr.s_addr = inet_addr (eXosip.http_proxy); _addr.sin_family = PF_INET; if (connect (net_int->net_socket, (struct sockaddr *) &_addr, sizeof (_addr)) == -1) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Failed to connect to http server on %s:%i!\n", eXosip.http_proxy, port)); return -1; } sprintf (http_req, "GET / HTTP/1.1\r\nUdpHost: %s:%d\r\n\r\n", eXosip.http_outbound_proxy, 5060); len = send (net_int->net_socket, http_req, (int) strlen (http_req), 0); if (len < 0) return -1; osip_usleep (50000); if ((len = recv (net_int->net_socket, http_reply, sizeof (http_reply), 0)) > 0) http_reply[len] = '\0'; else return -1; if (strncmp (http_reply, "HTTP/1.0 200 OK\r\n", 17) == 0 || strncmp (http_reply, "HTTP/1.1 200 OK\r\n", 17) == 0) { } else return -1; } eXosip.j_thread = (void *) osip_thread_create (20000, _eXosip_thread, NULL); if (eXosip.j_thread == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot start thread!\n")); return -1; } return 0;}inteXosip_init (void){ osip_t *osip; memset (&eXosip, 0, sizeof (eXosip)); eXosip.remove_preloadedroute=1; snprintf(eXosip.ipv4_for_gateway, 256, "%s", "217.12.3.11");#ifdef WIN32 /* Initializing windows socket library */ { WORD wVersionRequested; WSADATA wsaData; int i; wVersionRequested = MAKEWORD (1, 1); i = WSAStartup (wVersionRequested, &wsaData); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "eXosip: Unable to initialize WINSOCK, reason: %d\n", i)); /* return -1; It might be already initilized?? */ } }#endif eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION); eXosip.j_calls = NULL; eXosip.j_stop_ua = 0; eXosip.j_thread = NULL; eXosip.j_transactions = (osip_list_t *) osip_malloc (sizeof (osip_list_t)); osip_list_init (eXosip.j_transactions); eXosip.j_reg = NULL;#if !defined (_WIN32_WCE) eXosip.j_cond = (struct osip_cond *) osip_cond_init ();#endif eXosip.j_mutexlock = (struct osip_mutex *) osip_mutex_init (); if (-1 == osip_init (&osip)) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Cannot initialize osip!\n")); return -1; } osip_set_application_context (osip, &eXosip); eXosip_set_callbacks (osip); eXosip.j_osip = osip; /* open a TCP socket to wake up the application when needed. */ eXosip.j_socketctl = jpipe (); if (eXosip.j_socketctl == NULL) return -1; eXosip.j_socketctl_event = jpipe (); if (eXosip.j_socketctl_event == NULL) return -1; /* To be changed in osip! */ eXosip.j_events = (osip_fifo_t *) osip_malloc (sizeof (osip_fifo_t)); osip_fifo_init (eXosip.j_events); eXosip.use_rport = 1; return 0;}static int_eXosip_execute (void){ struct timeval lower_tv; int i; osip_timers_gettimeout (eXosip.j_osip, &lower_tv); if (lower_tv.tv_sec > 15) { lower_tv.tv_sec = 15; OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "eXosip: Reseting timer to 15s before waking up!\n")); } else { /* add a small amount of time on windows to avoid waking up too early. (probably a bad time precision) */ if (lower_tv.tv_usec < 900000) lower_tv.tv_usec = 100000; /* add 10ms */ else { lower_tv.tv_usec = 10000; /* add 10ms */ lower_tv.tv_sec++; } OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "eXosip: timer sec:%i usec:%i!\n", lower_tv.tv_sec, lower_tv.tv_usec)); } i = eXosip_read_message (1, lower_tv.tv_sec, lower_tv.tv_usec); if (i == -2) { return -2; } eXosip_lock (); osip_timers_ict_execute (eXosip.j_osip); osip_timers_nict_execute (eXosip.j_osip); osip_timers_ist_execute (eXosip.j_osip); osip_timers_nist_execute (eXosip.j_osip); osip_ict_execute (eXosip.j_osip); osip_nict_execute (eXosip.j_osip); osip_ist_execute (eXosip.j_osip); osip_nist_execute (eXosip.j_osip); /* free all Calls that are in the TERMINATED STATE? */ eXosip_release_terminated_calls (); eXosip_release_terminated_registrations (); eXosip_release_unused_transactions(); eXosip_unlock (); if (eXosip.keep_alive > 0) { _eXosip_keep_alive (); } return 0;}inteXosip_set_option (eXosip_option opt, const void *value){ int val; char *tmp; switch (opt) { case EXOSIP_OPT_UDP_KEEP_ALIVE: val = *((int *) value); eXosip.keep_alive = val; /* value in ms */ break; case EXOSIP_OPT_UDP_LEARN_PORT: val = *((int *) value); eXosip.learn_port = val; /* 1 to learn port */ break; case EXOSIP_OPT_SET_HTTP_TUNNEL_PORT: val = *((int *) value); eXosip.http_port = val; /* value in ms */ OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip option set: http_port:%i!\n", eXosip.http_port)); break; case EXOSIP_OPT_SET_HTTP_TUNNEL_PROXY: tmp = (char *) value; memset (eXosip.http_proxy, '\0', sizeof (eXosip.http_proxy)); if (tmp != NULL && tmp[0] != '\0') strncpy (eXosip.http_proxy, tmp, sizeof (eXosip.http_proxy)); /* value in proxy:port */ OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip option set: http_proxy:%s!\n", eXosip.http_proxy)); break; case EXOSIP_OPT_SET_HTTP_OUTBOUND_PROXY: tmp = (char *) value; memset (eXosip.http_outbound_proxy, '\0', sizeof (eXosip.http_outbound_proxy)); if (tmp != NULL && tmp[0] != '\0') strncpy (eXosip.http_outbound_proxy, tmp, sizeof (eXosip.http_outbound_proxy)); /* value in proxy:port */ OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip option set: http_outbound_proxy:%s!\n", eXosip.http_outbound_proxy)); break; case EXOSIP_OPT_DONT_SEND_101: val = *((int *) value); eXosip.dontsend_101 = val; /* 0 to disable */ break; case EXOSIP_OPT_USE_RPORT: val = *((int *) value); eXosip.use_rport = val; /* 0 to disable (for broken NAT only?) */ break; case EXOSIP_OPT_SET_IPV4_FOR_GATEWAY: tmp = (char *) value; memset (eXosip.ipv4_for_gateway, '\0', sizeof (eXosip.ipv4_for_gateway)); if (tmp != NULL && tmp[0] != '\0') strncpy (eXosip.ipv4_for_gateway, tmp, sizeof (eXosip.ipv4_for_gateway)); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip option set: ipv4_for_gateway:%s!\n", eXosip.ipv4_for_gateway)); break; } return 0;}static void_eXosip_keep_alive (void){ static struct timeval mtimer = { 0, 0 }; eXosip_reg_t *jr; struct eXosip_net *net; char buf[4] = "jaK"; struct timeval now; osip_gettimeofday (&now, NULL); if (mtimer.tv_sec == 0 && mtimer.tv_usec == 0) { /* first init */ osip_gettimeofday (&mtimer, NULL); add_gettimeofday (&mtimer, eXosip.keep_alive); } if (osip_timercmp (&now, &mtimer, <)) { return; /* not yet time */ } /* reset timer */ osip_gettimeofday (&mtimer, NULL); add_gettimeofday (&mtimer, eXosip.keep_alive); net = &eXosip.net_interfaces[0]; if (net == NULL) { return; } for (jr = eXosip.j_reg; jr != NULL; jr = jr->next) { if (jr->len > 0) { if (sendto (net->net_socket, (const void *) buf, 4, 0, (struct sockaddr *) &(jr->addr), jr->len) > 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: Keep Alive sent on UDP!\n")); } } }}void *_eXosip_thread (void *arg){ int i; while (eXosip.j_stop_ua == 0) { i = _eXosip_execute (); if (i == -2) osip_thread_exit (); } osip_thread_exit (); return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -