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

📄 sipp.cpp

📁 sipbomber - tool for testing SIP-protocol implementation (RFC3261). Current version can check only
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                 i,                 variable->getRegularExpression());          found = true;        }    }  }  if(!found) printf("=> No variable found for this scenario"SIPP_ENDL);  }/* Function to dump all available screens in a file */void print_screens(void){  int oldScreen = currentScreenToDisplay;    currentScreenToDisplay = DISPLAY_SCENARIO_SCREEN;    print_header_line(   screenf, 0);  print_stats_in_file( screenf, 0);  print_bottom_line(   screenf, 0);  currentScreenToDisplay = DISPLAY_STAT_SCREEN;    print_header_line(   screenf, 0);  CStat::instance()->displayStat(screenf);  print_bottom_line(   screenf, 0);    currentScreenToDisplay = DISPLAY_REPARTITION_SCREEN;    print_header_line(   screenf, 0);  CStat::instance()->displayRepartition(screenf);  print_bottom_line(   screenf, 0);  currentScreenToDisplay = oldScreen;}void print_statistics(int last){  static int first = 1;  if(backgroundMode == false) {    if(!last) {      screen_clear();    }    if(first) {      first = 0;      printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"             "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");    }    print_header_line(stdout,last);    switch(currentScreenToDisplay) {      case DISPLAY_STAT_SCREEN :        CStat::instance()->displayStat(stdout);        break;      case DISPLAY_REPARTITION_SCREEN :        CStat::instance()->displayRepartition(stdout);        break;      case DISPLAY_VARIABLE_SCREEN  :        print_variable_list();        break;      case DISPLAY_SCENARIO_SCREEN :      default:        print_stats_in_file(stdout, last);        break;    }    print_bottom_line(stdout,last);    if(last) { fprintf(stdout,"\n"); }  }}void set_rate(double new_rate){  double L_temp ;    if(toolMode == MODE_SERVER) {    rate = 0;    open_calls_allowed = 0;  }  rate = new_rate;  if(rate < 0) {    rate = 0;  }  last_rate_change_time = clock_tick;  calls_since_last_rate_change = 0;    if(!open_calls_user_setting) {        int call_duration_min =  scenario_duration;    if(duration > call_duration_min) call_duration_min = duration;    if(call_duration_min < 1000) call_duration_min = 1000;        L_temp = (3 * rate * call_duration_min) / rate_period_s / 1000 ;    open_calls_allowed = (unsigned int) L_temp ;    if(!open_calls_allowed) {      open_calls_allowed = 1;    }  }}void sipp_sigusr1(int /* not used */){  /* Smooth exit: do not place any new calls and exit */  quitting = 1;}void sipp_sigusr2(int /* not used */){  if (!signalDump) {     signalDump = true ;  }}/* User interface thread */void keyb_thread (void * param){  int c;  while(!feof(stdin)){    c = screen_readkey();        switch (c) {    case '1':      currentScreenToDisplay = DISPLAY_SCENARIO_SCREEN;      print_statistics(0);      break;    case '2':      currentScreenToDisplay = DISPLAY_STAT_SCREEN;      print_statistics(0);      break;    case '3':      currentScreenToDisplay = DISPLAY_REPARTITION_SCREEN;      print_statistics(0);      break;    case '4':      currentScreenToDisplay = DISPLAY_VARIABLE_SCREEN;      print_statistics(0);      break;    case '+':      set_rate(rate + 1);      print_statistics(0);      break;          case '-':      set_rate(rate - 1);      print_statistics(0);      break;    case '*':      set_rate(rate + 10);      print_statistics(0);      break;          case '/':      set_rate(rate - 10);      print_statistics(0);      break;    case 'p':      if(paused) {         paused = 0;        set_rate(rate);      } else {        paused = 1;      }      print_statistics(0);      break;    case 'q':      quitting = 1;      print_statistics(0);      return;    }  }}/*************************** Mini SIP parser ***************************/char * get_peer_tag(char *msg){  char        * to_hdr;  char        * ptr;   char        * end_ptr;  static char   tag[MAX_HEADER_LEN];  int           tag_i = 0;    to_hdr = strstr(msg, "\r\nTo:");  if(!to_hdr) to_hdr = strstr(msg, "\r\nto:");  if(!to_hdr) to_hdr = strstr(msg, "\r\nTO:");  if(!to_hdr) to_hdr = strstr(msg, "\r\nt:");  if(!to_hdr) {    ERROR("No valid To: header in reply");  }  // Remove CRLF  to_hdr += 2;  end_ptr = strchr(to_hdr,'\n');  ptr = strchr(to_hdr, '>');  if (!ptr) {    return NULL;  }    ptr = strchr(to_hdr, ';');     if(!ptr) {    return NULL;  }    to_hdr = ptr;  ptr = strstr(to_hdr, "tag");  if(!ptr) { ptr = strstr(to_hdr, "TAG"); }  if(!ptr) { ptr = strstr(to_hdr, "Tag"); }  if(!ptr) {    return NULL;  }  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;  bool short_form;  short_form = false;  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:"); }  // For short form, we need to make sure we start from beginning of line  // For others, no need to  if(!ptr1) { ptr1 = strstr(msg, "\r\ni:"); short_form = true;}  if(!ptr1) { ERROR_P1("(1) No valid Call-ID: header in reply '%s'", msg); }    if (short_form) {    ptr1 += 4;  } else {    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 != ' ') && (*msg != '\t')) msg ++;  while((msg) && ((*msg == ' ') || (*msg == '\t'))) msg ++;  if ((msg) && (strlen(msg)>0)) {    return atol(msg);  } else {    return 0;  }}/*************************** 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 ;  int    err;  recv_size = SSL_read(ssl,buffer, size);  sip_tls_error_handling(ssl, recv_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;  bool short_form;  short_form = false;  // Try to read SIP Header Message only  // or CMD Message  while(len < buffer_size) {        // Read one char on tcp socket    recv_size = recv_all_tcp(sock, &(buffer[len]), 1, 1);

⌨️ 快捷键说明

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