?? ua_main.cpp
字號:
"\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;
//初始化協(xié)議棧名
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);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -