一、源码下载
Index of /download/exosip2/,这里选择libeXosip2-3.5.0.tar.gz和libosip2-3.5.0.tar.gz
二、osip2库编译
cd libosip2-3.5.0/
./configure --enable-static
make
make install
三、eXosip2库编译
cd libeXosip2-3.5.0/
./configure --enable-static
make
make install
四、eXosip2客户端
#include <iostream>
#include <string>
#include <sstream>
#include <osipparser2/osip_message.h>
#include <osipparser2/osip_parser.h>
#include <osipparser2/osip_port.h>
#include <eXosip2/eXosip.h>
#include <eXosip2/eX_setup.h>
#include <eXosip2/eX_register.h>
#include <eXosip2/eX_options.h>
#include <eXosip2/eX_message.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
#define LISTEN_ADDR ("192.168.50.57")
#define UACPORT ("5061")
#define UACPORTINT (5061)
#define UACCODE ("100110000201000000")
#define UACPWD ("12345")
#define UAS_ADDR ("192.168.50.57")
#define UAS_PORT ("5060")
#define EXPIS 300
static int iCurrentStatus;
static int iHandle = -1;
class CSipFromToHeader
{
public:
CSipFromToHeader()
{
}
~CSipFromToHeader()
{
}
void SetHeader(string addrCod, string addrI, string addrPor)
{
addrCode = addrCod;
addrIp = addrI;
addrPort = addrPor;
}
string GetFormatHeader()
{
std::stringstream stream;
stream << "sip: " << addrCode << "@" << addrIp << ":" << addrPort;
return stream.str();
}
string GetCode()
{
std::stringstream stream;
stream << addrCode;
return stream.str();
}
string GetAddr()
{
std::stringstream stream;
stream << addrIp;
return stream.str();
}
string GetPort()
{
std::stringstream stream;
stream << addrPort;
return stream.str();
}
private:
string addrCode;
string addrIp;
string addrPort;
};
class CContractHeader: public CSipFromToHeader
{
public:
CContractHeader()
{
}
~CContractHeader()
{
}
void SetContractHeader(string addrCod, string addrI, string addrPor)
{
SetHeader(addrCod, addrI, addrPor);
}
string GetContractFormatHeader()
{
std::stringstream stream;
stream << "<sip:" << GetCode() << "@" << GetAddr() << ":" << GetPort()
<< ">";
return stream.str();
}
};
int SendRegister(int& registerId, CSipFromToHeader &from, CSipFromToHeader &to,
CContractHeader &contact, const string& userName, const string& pwd,
const int expires, int iType)
{
cout << "=============================================" << endl;
if (iType == 0)
{
cout << "注册请求信息:" << endl;
}
else if (iType == 1)
{
cout << "刷新注册信息:" << endl;
}
else
{
cout << "注销信息:" << endl;
}
cout << "registerId " << registerId << endl;
cout << "from " << from.GetFormatHeader() << endl;
cout << "to " << to.GetFormatHeader() << endl;
cout << "contact" << contact.GetContractFormatHeader() << endl;
cout << "userName" << userName << endl;
cout << "pwd" << pwd << endl;
cout << "expires" << expires << endl;
cout << "=============================================" << endl;
static osip_message_t *regMsg = 0;
int ret;
::eXosip_add_authentication_info(userName.c_str(), userName.c_str(),
pwd.c_str(), "MD5", NULL);
eXosip_lock();
if (0 == registerId)
{
registerId = ::eXosip_register_build_initial_register(
from.GetFormatHeader().c_str(), to.GetFormatHeader().c_str(),
contact.GetContractFormatHeader().c_str(), expires, ®Msg);
if (registerId <= 0)
{
return -1;
}
}
else
{
ret = ::eXosip_register_build_register(registerId, expires, ®Msg);
if (ret != OSIP_SUCCESS)
{
return ret;
}
if (expires == 0)
{
osip_contact_t *contact = NULL;
char tmp[128];
osip_message_get_contact(regMsg, 0, &contact);
{
sprintf(tmp, "<sip:%s@%s:%s>;expires=0",
contact->url->username, contact->url->host,
contact->url->port);
}
//osip_contact_free(contact);
//reset contact header
osip_list_remove(®Msg->contacts, 0);
osip_message_set_contact(regMsg, tmp);
osip_message_set_header(regMsg, "Lo