⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exconf.c

📁 libosip2-3版本的osip源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
          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 + -