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;
}