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

📄 ua_main.cpp

📁 改进后的SIP SERVICE API
💻 CPP
📖 第 1 页 / 共 3 页
字号:
     "\n" 
     "    -lb copies:    Load balance on n UAS copy (default is 1).\n"
     "\n" 
     "    -cls:          Close the session from UAS side after receiving the.\n"
     "                   ACK request.\n"
     "\n" 
     "  UAC options:\n"
     "  ------------\n" 
     "\n" 
     "    -c SIP_URL:    Switch to UAC mode and call the specified target\n"
     "                   SIP_URL.\n"
     "\n" 
     "    -cps cps:      Use UAC multithread mode with 'cps' traffic\n"
     "                   rate (calls per second).\n"
     "\n" 
     "    -s delay:      Time (seconds) between Ack and Bye (default is 0).\n" 
     "\n" 
     "    -d delay:      Delay before ativating probes in seconds.\n" 
     "\n" 
     "    -nt number:    Number of sender threads.\n"
     "\n" 
     "    -sb SIP_URL:   Sends a call stateless BYE transaction to the\n"
     "                   specified SIP URL. Also allows stateless messages.\n"
     "                   This option forces the -st option.\n"
     "\n" 
     "    -re seconds:   Sends a RE-INVITE instead of an BYE after the \n"
     "                   specified delay.\n"
     "\n" 
     "  Notifier options:\n"
     "  -----------------\n" 
     "\n" 
     "  When UAS (no options) when we receive a SUBSCRIBE request, the\n" 
     "  program switchs to the notifier mode, and sends a NOTIFY\n" 
     "  request. On reception of a SUBSCRIBE with expires = 0 request,\n" 
     "  the program replies with a NOTIFY 'terminated' and closes the,\n" 
     "  subscription.\n" 
     "\n" 
     "    -stb:          When notifier, send a NOTIFY without the \n"
     "                   'terminated' state, after receiving a SUBSCRIBE\n"
     "                   with expires = 0.\n"
     "\n"
     "    -std:          When notifier, destroys the session instead of \n"
     "                   sending a NOTIFY with the 'terminated' sate after \n"
     "                   receiving a SUBSCRIBE with expires = 0.\n"
     "\n"
     "    -snn:          When notifier, Do not send a NOTIFY after reception\n"
     "                   of the SUBSCRIBE message.\n"
     "\n"
     "  Subscriber options:\n"
     "  -------------------\n" 
     "\n" 
     "  When UAC, the program can send a SUBSCRIBE request either in\n" 
     "  a new call or using an existing call created by an INVITE.\n" 
     "\n" 
     "    -sub:          Tells the UAC to act as a subscriber. For each \n"
     "                   outgoing call, the UAC will send a SUBSCRIBE with\n"
     "                   header Expires set to expires. Default value = 0.\n"
     "\n"
     "    -exp delay:    Expires header value (default is 0). \n"
     "\n" 
     "    -new:          Tells the UAC to send SUBSCRIBE in new calls and\n"
     "                   not usingexisting calls.\n"
     "\n" 
     "  Refer:\n"
     "  ------\n" 
     "\n" 
     "    -refer uri:    Sends a REFER method with the Refer-To header\n"
     "                   set to 'uri'.\n"
     "\n",
     exe_name, ip_add);
  
  exit(0);
}

int main (int argc, char *argv[])
{
  int                          argi;

  char                         L_className[255] = { 0 };
  int                          L_unbindService = 0;
  int                          L_nbcall = 0;
  SIP_TransportType            L_trpType;
  //int                          L_nfinishedCalls = 0;
  hrtime_t                     L_delayBeforeActivate;
  int                          L_unbindAtTheEnd = 0;
  int                          L_destructive_mode = 0;
  int                          L_trans_deleted_mode = 0;
  int                          L_numberOfUasCopies = 1;
  int                          L_manual_provisionning = 0;

  char                         LocalServer[255] = { 0 };
  char                         buffer[64] = { 0 };
  struct hostent             * sip_local_host = NULL;
  char                         sip_appli_name[80] = { 0 };
  char                         sip_local_ip[50];
  int                          VB_client_mode=0;
  struct sigaction             action;
  char                       * param_ff = (char *)"defaultFF";
  char                       * L_ProbeManagerName = NULL;
  int                          L_numberOfRepeat = 1;
  char                       * L_role = (char *)"UA";
  SIP_LogicalEntityType	       L_logicalEntity = SIP_LE_UA;
  sip_msg_error_t	             L_error;
  bool						             L_startbusy = false;
  hrtime_t					           L_selectMinimalDelay = 0;
  timeval					             L_selectMinimalDelayForSelect = {0,0};
  bool						             L_noService = false ;

  // Ignore the SIP_PIPE signal  信号处理
  memset(&action, 0, sizeof(action));
  action.sa_handler=SIG_IGN;
  sigaction(SIGPIPE, &action, NULL);

  // Get default local server
  if  ((gethostname(sip_appli_name,64) != 0)
       || (!(sip_local_host = gethostbyname(sip_appli_name)))) {
    printf("Cannot get local host informations\n");
    exit(1);
  } else {
    strcpy(sip_local_ip,
           (char *) inet_ntoa
           (*(struct in_addr *)(sip_local_host->h_addr_list[0])));
  }

  // Set default parameters
  G_reply = 0;
  G_time_wait = 0;
  G_trace = 0;
  G_sleep = 0;
  G_cps = 0;
  G_closeMode = 0;
  //初始化协议栈名
  sprintf(L_className, "service_example_%d", getpid());
  L_nbcall = 1;
  L_unbindService = 0;
  L_nbProbe = 1;
  L_delayBeforeActivate = 0;
  L_unbindAtTheEnd = 0;
  L_nbSenderThread = 0;
  G_Buggy_terminated = 0;
  LocalServer[0] = 0;
  G_service_username = (char *)"service";
  G_portNumber = 5060;

  // Parse command line
  for(argi = 1; argi < argc; argi++) {
    
    if((!strcmp(argv[argi], "-h"    )) ||
       (!strcmp(argv[argi], "--h"   )) || 
       (!strcmp(argv[argi], "--help")) || 
       (!strcmp(argv[argi], "-help" ))    ) {
      usage(argv[0],sip_local_ip);
      exit(0);
    }
    
    if(!strcmp(argv[argi], "-l")) {
      if((++argi) < argc) {
        strcpy(LocalServer, argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-v")) {
      G_trace = 1;
    }

    if(!strcmp(argv[argi], "-ubs")) {
      L_unbindService = 1;
    }
    
    if(!strcmp(argv[argi], "-silent")) {
      G_silent = 1;
    }
    
    if(!strcmp(argv[argi], "-ubp")) {
      L_unbindAtTheEnd = 1;
    }

    if(!strcmp(argv[argi], "-snn")) {
      G_snn_option = 1;
    }

    if(!strcmp(argv[argi], "-sd")) {
      L_destructive_mode = 1;
    }
    if(!strcmp(argv[argi], "-st")) {
      L_trans_deleted_mode = 1;
    }
    if(!strcmp(argv[argi], "-noservice")) {
      L_noService = true;
    }

    if(!strcmp(argv[argi], "-smd")) {
      if((++argi) < argc) 
        {
          L_selectMinimalDelay = atol(argv[argi]);
          L_selectMinimalDelay = L_selectMinimalDelay*1000000;
          L_selectMinimalDelayForSelect.tv_usec=atol(argv[argi])*1000;
        }
    }


    if(!strcmp(argv[argi], "-startbusy")) {
      L_startbusy = true;
    }
    
    if(!strcmp(argv[argi], "-stb")) {
      G_Buggy_terminated = 1;
    }
    
    if(!strcmp(argv[argi], "-std")) {
      G_destroy_on_unsubscribe = 1;
    }

    if (!strcmp(argv[argi], "-new")) {
      G_new_call = 1;
    }

    if (!strcmp(argv[argi], "-sub")) {
      G_subscribe = 1;
    }

    if(!strcmp(argv[argi], "-exp")) {
      if((++argi) < argc) {
        G_expires = atol(argv[argi]);	
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-r")) {
      if((++argi) < argc) {
        G_reply = atol(argv[argi]);	
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-nt")) {
      if((++argi) < argc) {
        L_nbSenderThread = atol(argv[argi]);
        if (L_nbSenderThread>0) G_blockingMode =  true;
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-t")) {
      if((++argi) < argc) {
        G_time_wait = atol(argv[argi]);	
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-c")) {
      if((++argi) < argc) {
        L_target.append(argv[argi]);
	 printf("L_target = %s\n",L_target.c_str());
        VB_client_mode = 1;
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-refer")) {
      if((++argi) < argc) {
        G_refer = 1;
        G_referTo = argv[argi];
        if(!sip_msg_parse_uri((char*)G_referTo.c_str(), &L_error)) {
          std::cout <<"Syntax error near token \'"
                    <<L_error.unexpected_token 
                    << "\' in Refer-To URI\n" 
                    << "for string" 
                    << G_referTo 
                    << std::endl;
          usage(argv[0],sip_local_ip) ;
        }    
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-redir")) {
      if((++argi) < argc) {
        G_redir = sip_msg_parse_uri(argv[argi], NULL);
        if(!G_redir) {
          printf("Invalid URI for -redir option: '%s'.\n",
                 argv[argi]);
          usage(argv[0],sip_local_ip) ;
        }
        G_reply = 3;
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if (!strcmp(argv[argi], "-st")) {
      G_stateless_messages = 1;
    }

    if(!strcmp(argv[argi], "-sb")) {
      if((++argi) < argc) {
        L_target.append(argv[argi]);
        VB_client_mode = 1;
        G_stateless_bye = 1;
        G_stateless_messages = 1;
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-p")) {
      if((++argi) < argc) {
        G_portNumber = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-srv")) {
      if((++argi) < argc) {
        G_service_username = argv[argi];
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-cps")) {
      if((++argi) < argc) {
        G_cps  = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-s")) {
      if((++argi) < argc) {
        G_sleep  = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-re")) {
      if((++argi) < argc) {
        G_sleep    = atol(argv[argi]);
        G_reinvite = 1;
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-cl")) {
      if((++argi) < argc) {
        G_closeMode  = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-n")) {
      if((++argi) < argc) {
        L_nbcall = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-np")) {
      if((++argi) < argc) {
        L_nbProbe  = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-d")) {
      if((++argi) < argc) {
        L_delayBeforeActivate = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    
    if(!strcmp(argv[argi], "-re")) {
      if((++argi) < argc) {
        L_numberOfRepeat = atol(argv[argi]);
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }


    if(!strcmp(argv[argi], "-ff")) {
      if((++argi) < argc) {
        param_ff = argv[argi];
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

    if(!strcmp(argv[argi], "-pm")) {
      if((++argi) < argc) {
        L_ProbeManagerName = argv[argi];
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }
    if(!strcmp(argv[argi], "-ro")) {
      if((++argi) < argc) {
        L_role = argv[argi];
      } else {
        usage(argv[0],sip_local_ip);
        exit(1);
      }
    }

⌨️ 快捷键说明

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