[reSIProcate] STUN Error
Karlsson
boost.regex at gmail.com
Sun Jan 13 04:12:08 CST 2008
By the way, if make the call without STUN, then all are ok.
2008/1/13, Karlsson <boost.regex at gmail.com>:
>
> Hi all, I try to implement the STUN, but now I got a matter.
> As I read the WIKI, I wrote some code for my UA, now the UA can be used
> the STUN to register to server,
> but when I make a call, I got a assert error:
>
> TransportSelector::transmit, line 587
>
> assert((source.getPort()==temp.getPort() ||
> temp.getPort()==0) &&
> source.ipVersion()==temp.ipVersion() &&
> source.getType()==temp.getType());
>
>
>
> The attachment is SIP message log and there are my source code, please
> help me to solve this problem.
>
> Thanks
>
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> bool UserAgent::addUDPPort(int port, bool enableSTUN)
> {
> bool state = true;
>
> try
> {
> mUDPTransport = (resip::UdpTransport*)mStack.addTransport(UDP, port, V4,
> StunEnabled);
> }
> catch(const Transport::Exception& e)
> {
> state = false;
> }
>
> return state;
> }
>
> void UserAgent::sendStunTest()
> {
> if (!mUDPTransport)
> {
> return;
> }
>
> hostent* h = gethostbyname(mStunServer.c_str());
> if (!h)
> {
> return;
> }
>
> in_addr sin_addr = *(struct in_addr*)h->h_addr;
> resip::Tuple tStunDest(sin_addr, 3478, UDP, Data::Empty);
>
> mUDPTransport->stunSendTest(tStunDest);
>
> mLastStunTestTime = GetTickCount();
> }
>
>
> resip::Tuple UserAgent::getStunAddress()
> {
> resip::Tuple mappedAddress;
>
> mappedAddress.setPort(0);
>
> if (!mUDPTransport)
> {
> return mappedAddress;
> }
>
> if (!mUDPTransport->stunResult(mappedAddress))
> {
> // no valid result available, send another request
>
>
> sendStunTest();
> }
>
> else if ((GetTickCount() - mLastStunTestTime) > 1000 * 60 * 3)
> {
> // don't use a STUN response that is older than 3 minutes
> sendStunTest();
> }
>
> DWORD tmpLastStunTestTime = mLastStunTestTime;
>
> while ((GetTickCount() - tmpLastStunTestTime) < 5 * 1000) // wait 5s for
> result
> {
> if (mUDPTransport->stunResult(mappedAddress))
> {
> break;
> }
>
> Sleep(200);
> }
>
> mLastStunTestTime = 0;
>
> return mappedAddress;
> }
>
>
>
> void UserAgent::stunTest(const Data & stunServer, int stunPort)
> {
> mStunServer = stunServer;
> mStunPort = stunPort;
>
> if (stunServer.empty() == true)
> {
> return;
> }
>
> string ip;
> int port;
> Utility utility;
>
> string emptyIP = "0.0.0.0";
>
>
> for (int i=0; i<3; ++i)
> {
> Tuple mapAddress = getStunAddress();
> ip = Tuple::inet_ntop(mapAddress).c_str();
> port = mapAddress.getPort();
>
> if (utility.compareStringNoCase(ip, emptyIP) != 0)
> {
> break;
> }
> }
>
> if (utility.compareStringNoCase(ip, emptyIP) == 0)
> {
> return;
> }
>
>
>
> Data newUri = "sip:";
> newUri += ip.c_str();
> newUri += ":";
> Data temPort(port);
> newUri += temPort;
>
> Uri stunUri(newUri);
>
>
> mMasterProfile->setOverrideHostAndPort(stunUri);
>
> StunMessageDecorator * stunMessageDec = new StunMessageDecorator;
> stunMessageDec->setStunResult(ip, port);
>
> SharedPtr<MessageDecorator> messageDec((MessageDecorator
> *)stunMessageDec);
>
> mMasterProfile->setOutboundDecorator(messageDec);
>
> }
>
>
>
> void StunMessageDecorator::decorateMessage(SipMessage &msg, const Tuple
> &source, const Tuple &destination)
> {
> if (mStunPort!=0 && mStunIP.empty()==false)
> {
> Utility utility;
>
> ParserContainer<Via>::iterator viaIter = msg.header(h_Vias).begin();
> for (; viaIter!=msg.header(h_Vias).end(); ++viaIter)
> {
> string srcIP = Tuple::inet_ntop(source).c_str();
> string viaIP = msg.header(h_Vias).front().sentHost().c_str();
>
> if (utility.compareStringNoCase(srcIP, viaIP) == 0)
> {
> msg.header(h_Vias).front().sentPort() = mStunPort;
> msg.header(h_Vias).front().sentHost() = mStunIP.c_str();
> }
> }
> }
>
> }
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20080113/77737f4c/attachment.htm>
More information about the resiprocate-devel
mailing list