exosip2-5.0修改以支持获取UDP层源src ip

1.Exoisp.h末尾

加入:

 

  /// add by Andy 2019-12-06 16:17

  /*

  *get the last udp message remote ip addr

  */

  int eXosip_event_getUdpSocket(struct eXosip_t *excontext, char * remoteIpAddr, int *remotePort);

 

 

 

extl_udp.c

2. 95行修改:

struct eXtludp {

  int udp_socket;

  struct sockaddr_storage ai_addr;

  char *buf;

  void *QoSHandle;

  unsigned long QoSFlowID;

  

  int udp_socket_oc;

  struct sockaddr_storage ai_addr_oc;

  

  struct _udp_stream socket_tab[EXOSIP_MAX_SOCKETS];

 

  struct sockaddr_storage lastMessageRemote_addr; 

 

};

 

3.添加函数:

int eXosip_event_getUdpSocket(struct eXosip_t *excontext, char * remoteIpAddr, int *remotePort)

{

struct eXtludp *reserved = (struct eXtludp *) excontext->eXtludp_reserved;

 

struct sockaddr_storage sa = reserved->lastMessageRemote_addr;

 

socklen_t slen;

 

if (excontext->eXtl_transport.proto_family == AF_INET)

slen = sizeof (struct sockaddr_in);

else

slen = sizeof (struct sockaddr_in6);

 

char src6host[NI_MAXHOST] = {0};

int recvport = 0;

 

memset(src6host, 0, NI_MAXHOST);

recvport = _eXosip_getport((struct sockaddr *) &sa, slen);

_eXosip_getnameinfo((struct sockaddr *) &sa, slen, src6host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

 

strcpy(remoteIpAddr, src6host);

*remotePort = recvport;

 

return reserved->udp_socket;

}

 

 

4.udp_tl_read_message函数修改

每个recvfrom 后面加一句

reserved->lastMessageRemote_addr = sa;

 

static int

udp_tl_read_message (struct eXosip_t *excontext, fd_set * osip_fdset, fd_set * osip_wrset)

{

//printf("%s ========\n",__FUNCTION__);

  struct eXtludp *reserved = (struct eXtludp *) excontext->eXtludp_reserved;

  socklen_t slen;

  int i;

 

  if (reserved == NULL) {

    OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "wrong state: create transport layer first\n"));

    return OSIP_WRONG_STATE;

  }

 

  if (reserved->udp_socket <= 0)

    return -1;

 

  if (excontext->eXtl_transport.proto_family == AF_INET)

    slen = sizeof (struct sockaddr_in);

  else

    slen = sizeof (struct sockaddr_in6);

 

  if (FD_ISSET (reserved->udp_socket, osip_fdset)) {

    struct sockaddr_storage sa;

 

    if (reserved->buf == NULL)

      reserved->buf = (char *) osip_malloc (udp_message_max_length * sizeof (char) + 1);

    if (reserved->buf == NULL)

      return OSIP_NOMEM;

 

#ifdef TSC_SUPPORT

    if (excontext->tunnel_handle) {

      i = tsc_recvfrom (reserved->udp_socket, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

    }

    else {

      i = recvfrom (reserved->udp_socket, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

    }

#else

    i = (int) recvfrom (reserved->udp_socket, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

#endif

reserved->lastMessageRemote_addr = sa;

//printf("%s ===1111111=== len=%d buf=%s\n", __FUNCTION__, i, reserved->buf);

 

    if (i > 32) {

      char src6host[NI_MAXHOST];

      int recvport = 0;

 

      reserved->buf[i] = '\0';

 

      memset (src6host, 0, NI_MAXHOST);

      recvport = _eXosip_getport((struct sockaddr *) &sa, slen);

      _eXosip_getnameinfo((struct sockaddr *) &sa, slen, src6host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "Message received from: %s:%i\n", src6host, recvport));

 

      _eXosip_handle_incoming_message (excontext, reserved->buf, i, reserved->udp_socket, src6host, recvport, NULL, NULL);

 

      /* if we have a second socket for outbound connection, save information about inbound traffic initiated by receiving data on udp_socket */

      if (reserved->udp_socket_oc > 0)

      {

        int pos;

        for (pos = 0; pos < EXOSIP_MAX_SOCKETS; pos++) {

          /* does the entry already exist? */

          if (reserved->socket_tab[pos].remote_port == recvport && osip_strcasecmp(reserved->socket_tab[pos].remote_ip, src6host)==0) {

            OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "inbound traffic/connection already in table\n"));

            break;

          }

        }

        if (pos == EXOSIP_MAX_SOCKETS) {

          OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "inbound traffic/new connection detected (%s:%i\n", src6host, recvport));

          for (pos = 0; pos < EXOSIP_MAX_SOCKETS; pos++) {

            if (reserved->socket_tab[pos].out_socket ==0) {

              reserved->socket_tab[pos].out_socket=reserved->udp_socket;

              snprintf(reserved->socket_tab[pos].remote_ip, sizeof(reserved->socket_tab[pos].remote_ip), "%s", src6host);

              reserved->socket_tab[pos].remote_port=recvport;

              OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "inbound traffic/new connection added in table\n"));

              break;

            }

          }

        }

      }

      

    }

    else if (i < 0) {

#ifdef _WIN32_WCE

      int my_errno = 0;

#else

      int my_errno = errno;

#endif

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Could not read socket (%i) (%i) (%s)\n", i, my_errno, strerror (my_errno)));

      if (errno==0 || errno==34) {

        udp_message_max_length = udp_message_max_length*2;

        osip_free(reserved->buf);

        reserved->buf = (char *) osip_malloc (udp_message_max_length * sizeof (char) + 1);

      }

      if (my_errno == 57) {

        _udp_tl_reset (excontext);

      }

    }

    else {

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "Dummy SIP message received\n"));

    }

  }

 

  if (reserved->udp_socket_oc > 0 && FD_ISSET (reserved->udp_socket_oc, osip_fdset)) {

    struct sockaddr_storage sa;

    

    if (reserved->buf == NULL)

      reserved->buf = (char *) osip_malloc (udp_message_max_length * sizeof (char) + 1);

    if (reserved->buf == NULL)

      return OSIP_NOMEM;

    

#ifdef TSC_SUPPORT

    if (excontext->tunnel_handle) {

      i = tsc_recvfrom (reserved->udp_socket_oc, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

    }

    else {

      i = recvfrom (reserved->udp_socket_oc, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

}

#else

    i = (int) recvfrom (reserved->udp_socket_oc, reserved->buf, udp_message_max_length, 0, (struct sockaddr *) &sa, &slen);

#endif

//printf("%s ===2222222=== len=%d buf=%s\n", __FUNCTION__, i, reserved->buf);

reserved->lastMessageRemote_addr = sa;

    if (i > 32) {

      char src6host[NI_MAXHOST];

      int recvport = 0;

      

      reserved->buf[i] = '\0';

      

      memset (src6host, 0, NI_MAXHOST);

      recvport = _eXosip_getport((struct sockaddr *) &sa, slen);

      _eXosip_getnameinfo((struct sockaddr *) &sa, slen, src6host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "Message received from: %s:%i\n", src6host, recvport));

      

      _eXosip_handle_incoming_message (excontext, reserved->buf, i, reserved->udp_socket_oc, src6host, recvport, NULL, NULL);

      

    }

    else if (i < 0) {

#ifdef _WIN32_WCE

      int my_errno = 0;

#else

      int my_errno = errno;

#endif

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "Could not read socket (%i) (%i) (%s)\n", i, my_errno, strerror (my_errno)));

      if (errno==0 || errno==34) {

        udp_message_max_length = udp_message_max_length*2;

        osip_free(reserved->buf);

        reserved->buf = (char *) osip_malloc (udp_message_max_length * sizeof (char) + 1);

      }

      if (my_errno == 57) {

        _udp_tl_reset_oc (excontext);

      }

    }

    else {

      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "Dummy SIP message received\n"));

    }

  }

  

  return OSIP_SUCCESS;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值