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

📄 sipp.cpp

📁 sip终端
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  }  if (ptr>end_ptr) {    return NULL ;  }    ptr = strchr(ptr, '=');     if(!ptr) {    ERROR("Invalid tag param in To: header");  }  ptr ++;  while((*ptr)         &&         (*ptr != ' ')  &&         (*ptr != ';')  &&         (*ptr != '\t') &&         (*ptr != '\t') &&         (*ptr != '\r') &&          (*ptr != '\n') &&         (*ptr)) {    tag[tag_i++] = *(ptr++);  }  tag[tag_i] = 0;    return tag;}char * get_call_id(char *msg){  static char call_id[MAX_HEADER_LEN];  char * ptr1, * ptr2, backup;  ptr1 = strstr(msg, "Call-ID:");  if(!ptr1) { ptr1 = strstr(msg, "Call-Id:"); }  if(!ptr1) { ptr1 = strstr(msg, "Call-id:"); }  if(!ptr1) { ptr1 = strstr(msg, "call-Id:"); }  if(!ptr1) { ptr1 = strstr(msg, "call-id:"); }  if(!ptr1) { ptr1 = strstr(msg, "CALL-ID:"); }  if(!ptr1) { ERROR_P1("(1) No valid Call-ID: header in reply '%s'", msg); }    ptr1 += 8;    while((*ptr1 == ' ') || (*ptr1 == '\t')) { ptr1++; }    if(!(*ptr1)) { ERROR("(2) No valid Call-ID: header in reply"); }    ptr2 = ptr1;  while((*ptr2) &&         (*ptr2 != ' ') &&         (*ptr2 != '\t') &&         (*ptr2 != '\r') &&         (*ptr2 != '\n')) {     ptr2 ++;  }   if(!*ptr2) { ERROR("(3) No valid Call-ID: header in reply"); }  backup = *ptr2;  *ptr2 = 0;  strcpy(call_id, ptr1);  *ptr2 = backup;  return (char *) call_id;}unsigned long get_reply_code(char *msg){  while((*msg != ' ') && (*msg != '\t')) msg ++;  while((*msg == ' ') || (*msg == '\t')) msg ++;  return atol(msg);}/*************************** I/O functions ***************************/#ifdef _USE_OPENSSLint recv_all_tls(SSL *ssl, char *buffer, int size, int trace_id){  int    recv_size = 0;  char * start_buffer = buffer;  int    to_be_recvd = size;  int    part_size ;  recv_size = SSL_read(ssl,buffer, size);    if(recv_size <= 0) {    if(recv_size != 0) {      nb_net_recv_errors++;      WARNING_P3("TLS %d Recv error : size = %d,Dummy : %d ",                 trace_id, recv_size, trace_id);    } else {      /* This is normal for a server to have its client close       * the connection */      if(toolMode != MODE_SERVER) {        WARNING_P3("TLS %d Recv error : size = %d, dummy : %d  "                   "remote host closed connection",                   trace_id, recv_size,trace_id);        nb_net_recv_errors++;      }    }  }    return recv_size;}#endifint recv_all_tcp(int sock, char *buffer, int size, int trace_id){  int    recv_size = 0;  char * start_buffer = buffer;  int    to_be_recvd = size;  int    part_size ;  do {    part_size = recv(sock, start_buffer, to_be_recvd, 0);        if(part_size > 0) {      to_be_recvd -= part_size;      start_buffer += part_size;      recv_size += part_size;    } else {      recv_size = part_size;    }      } while((part_size > 0) && to_be_recvd);    if(recv_size <= 0) {    if(recv_size != 0) {      nb_net_recv_errors++;      WARNING_P3("TCP %d Recv error : size = %d, sock = %d",                 trace_id, recv_size, sock);      WARNING_NO("TCP Recv error");      // ERROR_NO("TCP recv error");    } else {#ifdef __3PCC__      if (toolMode == MODE_3PCC_CONTROLLER_B) {        /* In 3PCC controller B mode, twin socket is closed at peer closing.         * This is a normal case: 3PCC controller B should end now */        ERROR("3PCC controller A has ended -> exiting");      } else#endif        /* This is normal for a server to have its client close         * the connection */        if(toolMode != MODE_SERVER) {          WARNING_P3("TCP %d Recv error : size = %d, sock = %d, "                     "remote host closed connection",                     trace_id, recv_size, sock);#ifdef __3PCC__	  if(sock == twinSippSocket || sock == localTwinSippSocket) {            int L_poll_idx = 0 ;	    quitting = 1;	    for((L_poll_idx) = 0;	        (L_poll_idx) < pollnfds;	        (L_poll_idx)++) {	         if(pollfiles[L_poll_idx].fd == twinSippSocket) {		   pollset_remove(L_poll_idx);                  }		 if(pollfiles[L_poll_idx].fd == localTwinSippSocket) {		    pollset_remove(L_poll_idx);                  }              }	      if(twinSippSocket) {		       shutdown(twinSippSocket, SHUT_RDWR);		       close(twinSippSocket);		       twinSippSocket = 0 ;              }	      if(localTwinSippSocket) {		       shutdown(localTwinSippSocket, SHUT_RDWR);		       close(localTwinSippSocket);		       localTwinSippSocket = 0 ;              }          }#endif          nb_net_recv_errors++;        }    }  }    return recv_size;}#ifdef _USE_OPENSSLint recv_tls_message(SSL * ssl,                     char *buffer,                     int buffer_size,                     E_Alter_YesNo alter_msg){  int len = 0;  int recv_size;  char * ctl_hdr;  int content_length;  len = recv_size = recv_all_tls(ssl, buffer, buffer_size, 1);  if(recv_size <= 0) {    return recv_size;  }  if(len >= buffer_size) {    ERROR("TLS msg too big");  }  buffer[len] = 0;  return len;}#endif    int recv_tcp_message(int sock,                     char *buffer,                     int buffer_size,                     E_Alter_YesNo alter_msg,                     E_Alter_YesNo isControlMsg = E_ALTER_NO){  int len = 0;  int recv_size;  char * ctl_hdr;  int content_length;  // Try to read SIP Header Message only  // or CMD Message  while(1) {        // Read one char on tcp socket    recv_size = recv_all_tcp(sock, &(buffer[len]), 1, 1);        // Check read problem return    if(recv_size <= 0) {      return recv_size;    }    len++;    // Search the end Message condition     if (isControlMsg == E_ALTER_NO) {      // In case of SIP Message \r\n follow by       // \r\n is header end      if((buffer[len-1] == '\n') &&          (buffer[len-2] == '\r') &&          (buffer[len-3] == '\n') &&          (buffer[len-4] == '\r')) {        /* CRLF CRLF Detected */        buffer[len] = 0;        break;      }    }    else    {      // In case of CMD Message      // escape char is the end of message      if((alter_msg==E_ALTER_NO) &&         (buffer[len-1] == 27)) {        /* End delimitor detected, stop receiving */        buffer[len-1] = 0;        return (len - 1);      }    }  }  if(len >= buffer_size) {    ERROR("TCP msg too big");  }    // Now search the content length of the body  // part of SIP or CMD Message  ctl_hdr = strstr(buffer, "Content-Length:");  if(!ctl_hdr) ctl_hdr = strstr(buffer, "Content-length:");  if(!ctl_hdr) ctl_hdr = strstr(buffer, "content-Length:");  if(!ctl_hdr) ctl_hdr = strstr(buffer, "content-length:");  if(!ctl_hdr) ctl_hdr = strstr(buffer, "CONTENT-LENGTH:");  // Content Length was found  // Read its value  if((ctl_hdr) && (alter_msg==E_ALTER_YES)) {    ctl_hdr += 15;    content_length = atoi(ctl_hdr);  } else {    content_length = 0;  }    // If a body exist read it  if(content_length) {    /* Ensure remaining content will fit in remaining buffer size */    if(content_length > (buffer_size - len)) {      ERROR("TCP msg too big");    }        // Read Body part     do {      recv_size = recv_all_tcp(sock, &(buffer[len]), content_length, 2);            if(recv_size <= 0) {        return recv_size;      }            len += recv_size;      content_length -= recv_size;    } while(content_length);  }    // Add the final '\0'  buffer[len] = 0;    return len;}int decompress_if_needed(int sock, char *buff,  int len, void **st){  if(compression && len) {    struct timeval currentTime;    GET_TIME (&currentTime);    TRACE_MSG((s,               "----------------------------------------------- %s\n"               "Compressed message received, header :\n"               "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x "               "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",               CStat::instance()->formatTime(&currentTime),               buff[0] , buff[1] , buff[2] , buff[3],               buff[4] , buff[5] , buff[6] , buff[7],               buff[8] , buff[9] , buff[10], buff[11],               buff[12], buff[13], buff[14], buff[15]));        int rc = comp_uncompress(st,                             buff,                              (unsigned int *)&len);        switch(rc) {    case COMP_OK:      TRACE_MSG((s,"Compressed message decompressed properly.\n"));      break;    case COMP_REPLY:      TRACE_MSG((s,                  "Compressed message KO, sending a reply (resynch).\n"));      sendto(sock,             buff,              len,              0,             (sockaddr *)(void *)&remote_sockaddr,             SOCK_ADDR_SIZE(&remote_sockaddr));      resynch_send++;      return 0;    case COMP_DISCARD:      TRACE_MSG((s, "Compressed message discarded by pluggin.\n"));      resynch_recv++;      return 0;    default:    case COMP_KO:      ERROR("Compression pluggin error");      return 0;    }  }  return len;}void sipp_customize_socket(int s){  unsigned int buffsize = 65535;  /* Allows fast TCP reuse of the socket */#ifdef _USE_OPENSSL  if (transport == T_TCP || transport == T_TLS ) { #else  if (transport == T_TCP) { #endif    int sock_opt = 1;    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&sock_opt,                   sizeof (sock_opt)) == -1) {      ERROR_NO("setsockopt(SO_REUSEADDR) failed");    }#ifndef SOL_TCP#define SOL_TCP 6#endif    if (setsockopt (s, SOL_TCP, TCP_NODELAY, (void *)&sock_opt,                    sizeof (sock_opt)) == -1) {      {        ERROR_NO("setsockopt(TCP_NODELAY) failed");      }    }    {      struct linger linger;            linger.l_onoff = 1;      linger.l_linger = 1;      if (setsockopt (s, SOL_SOCKET, SO_LINGER,                       &linger, sizeof (linger)) < 0) {        ERROR_NO("Unable to set SO_LINGER option");      }    }  }        /* Increase buffer sizes for this sockets */  if(setsockopt(s,                SOL_SOCKET,                SO_SNDBUF,                &buffsize,                sizeof(buffsize))) {    ERROR_NO("Unable to set socket sndbuf");  }    buffsize = 65535;  if(setsockopt(s,                SOL_SOCKET,                SO_RCVBUF,                &buffsize,                sizeof(buffsize))) {    ERROR_NO("Unable to set socket rcvbuf");  }  }  #ifdef _USE_OPENSSLint send_message_tls(SSL *ssl, void ** comp_state, char * msg){	int rc;		 rc = send_nowait_tls(ssl, msg, strlen(msg), 0);  if(rc == 0) {    nb_net_send_errors++;    ERROR_NO("Unable to send TLS message");    return -2;  }  return rc;}#endifint send_message(int s, void ** comp_state, char * msg){  struct sockaddr_storage *L_dest = &remote_sockaddr;  if(transport == T_TCP) {    int rc;    rc = send_nowait(s,                      msg,                      strlen(msg),                      0);    #ifdef EAGAIN    if(errno == EAGAIN) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -