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

📄 sipbst_sendrecv.cpp

📁 sip torture test tools
💻 CPP
字号:
//sipbst_sendrecv.cpp//Copyright (C) 2003 Metalink LTD//Author: Rodionov Sergey (seger@metalinkltd.com)//This program is distributed under terms of GPL (see LICENSE)#include "sipbst_sendrecv.h"#include "sipb_bnftools.h"#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdexcept>//                                                                            sipbst_sendrecv::sipbst_sendrecv(){   tr_send=new sipb_udptrans;   tr_recv=new sipb_udptrans;   is_sr_same=true;   paramlist()->add_wanted(SIPB_SP_SIPSERVER,true,			   SIPB_SP_SIPSERVER_DEF);   paramlist()->add_wanted_int(SIPB_SP_SERV_UDPPORT,true,0,			       SIPB_SP_MAX_PORT,			       SIPB_SP_SERV_UDPPORT_DEF);   paramlist()->add_wanted_int(SIPB_SP_SERV_TCPPORT,true,0,			       SIPB_SP_MAX_PORT,			       SIPB_SP_SERV_TCPPORT_DEF);   vector<string> tmp;   tmp.push_back(SIPB_TRANS_UDP);   tmp.push_back(SIPB_TRANS_TCP);   tmp.push_back(SIPB_TRANS_TCP_BROKEN);   tmp.push_back(SIPB_TRANS_ANY);   paramlist()->add_wanted_voriants(SIPB_SP_TRANSPORT,true,tmp);      paramlist()->add_wanted_int(SIPB_SP_NSEND,true,0,			       SIPB_SP_MAX_INT,			       SIPB_SP_NSEND_DEF);   paramlist()->add_wanted_int(SIPB_SP_NRESEND,true,0,			       SIPB_SP_MAX_INT,			       SIPB_SP_NRESEND_DEF);   paramlist()->add_wanted_int(SIPB_SP_RESEND_TIMEOUT,true,0,			       SIPB_SP_MAX_INT,			       SIPB_SP_RESEND_TIMEOUT_DEF);}//                                                                            sipbst_sendrecv::~sipbst_sendrecv(){   delete tr_send;   delete tr_recv;}//                                                                            void sipbst_sendrecv::work(){   //Read parameters from paramlist   servhost_name=paramlist()->get(SIPB_SP_SIPSERVER);   if (!serv_ip.try_set(paramlist()->get(SIPB_SP_SIPSERVER)))     {	add_gen_error("Bad server name");	return;     }   udp_port=paramlist()->get_int(SIPB_SP_SERV_UDPPORT);   tcp_port=paramlist()->get_int(SIPB_SP_SERV_TCPPORT);   transport=paramlist()->get(SIPB_SP_TRANSPORT);   n_send=paramlist()->get_int(SIPB_SP_NSEND);   n_resend=paramlist()->get_int(SIPB_SP_NRESEND);   resend_timeout=paramlist()->get_int(SIPB_SP_RESEND_TIMEOUT);      //get add parameters   run_beforework();      //work   for (int i=0 ; i < n_send ; i++)     {	//Add general Information -- we start new iteration	add_gen_info("--- Start new test iteration --- ");	refresh_net();	_work();	if (check_wantstop())	  i=n_send;     }}//                                                                            int sipbst_sendrecv::get_waitport(){   if (is_sr_same)     return tr_send->get_port();   return tr_recv->get_port();}//                                                                            string sipbst_sendrecv::get_waitif(){   if (is_sr_same)     return tr_send->get_if();   return tr_recv->get_if();}//                                                                            bool sipbst_sendrecv::send_recv(sipb_stpacket* tosend,sipb_stpacket* torecv){   //TODO: then TCP(broken) may be we need rebin tr_send!!!      //choose transport for recive (write to tmp_recv)   sipb_transport* tmp_recv=tr_recv;   if (is_sr_same)     tmp_recv=tr_send; //only for TCP   int tr=0;          //number of resend (try)   while ( tr <= n_resend )     {	//send packet	if (!tr_send->send(serv_ip.ip(), serv_port() , *tosend))	  {	     if (tr_send->check_hungup())	       {		  add_gen_error("Probably server down (then send)");		  set_wantstop();		  return false;	       }	     tosend->add_error("Can't Send packet (for UDP probably packet too big)");	     return false;	  }	if (!is_sr_same)  //for TCP we must broken connection                          //(if we want to recive by tr_recv)	                  //(we not need reset via because!!!)	  tr_send->rebind();	if (torecv==NULL)  //if not want recive	  return false;	//try recive packet	if (tmp_recv->recv(serv_ip.ip(),serv_port(),*torecv,			   resend_timeout))	  return true;	if (tmp_recv->check_hungup() || tr_send->check_hungup())	  {	     add_gen_error("Probably server down (then recv)");	     set_wantstop();	     return false;	  }	tr++;     }   return false;}//                                                                           bool sipbst_sendrecv::recv(sipb_stpacket* torecv){   if (!torecv)     return false;   sipb_transport* tmp_recv=tr_recv;   if (is_sr_same)     tmp_recv=tr_send; //only for TCP   //try recive packet   if (tmp_recv->recv(serv_ip.ip(),serv_port(),*torecv,		      resend_timeout))     return true;   if (tmp_recv->check_hungup())     {	add_gen_error("Probably server down (then recv)");	set_wantstop();	return false;     }   return false;}//                                                                           bool sipbst_sendrecv::send(sipb_stpacket* tosend){   if (!tr_send->send(serv_ip.ip(), serv_port() , *tosend))     {	if (tr_send->check_hungup())	  {	     add_gen_error("Probably server down (then send)");	     set_wantstop();	     return false;	  }	tosend->add_error("Can't Send packet (for UDP probably packet too big)");	return false;     }   return true;}//                                                                           void sipbst_sendrecv::refresh_net(){   delete tr_send;   delete tr_recv;   is_sr_same=false;   string transport_now=transport;   if (transport_now==SIPB_TRANS_ANY)     {	if (random()%2)	  transport_now=SIPB_TRANS_UDP;	else	  transport_now=SIPB_TRANS_TCP_RANDOM;     }   if (transport_now==SIPB_TRANS_TCP_RANDOM)     {	if (random()%2)	  transport_now=SIPB_TRANS_TCP;	else	  transport_now=SIPB_TRANS_TCP_BROKEN;     }   if (transport_now==SIPB_TRANS_UDP)     {	is_sr_same=false;	tr_send=new sipb_udptrans;	tr_recv=new sipb_udptrans;     }   else if (transport_now==SIPB_TRANS_TCP)     {	is_sr_same=true;	tr_send=new sipb_tcptrans;	tr_recv=new sipb_tcptrans;     }   else if (transport_now==SIPB_TRANS_TCP_BROKEN)     {	is_sr_same=false;	tr_send=new sipb_tcptrans;	tr_recv=new sipb_tcptrans;     }   else      qFatal("sipbst_sendrecv::refresh_net: logic Error bad transport=%s",transport_now.c_str());}//                                                                           int sipbst_sendrecv::serv_port(){   if (sipb_bnftools::casecmp(tr_send->get_if(),"udp"))     return udp_port;   if (sipb_bnftools::casecmp(tr_send->get_if(),"tcp"))     return tcp_port;   throw logic_error("Error in sipbst_sendrecv::serv_port");}//                                                                           

⌨️ 快捷键说明

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