< Previous by Date | Date Index | Next by Date > |
Thread Index |
I’ll assume from API signatures that
you are using, that you are not using the head SVN revision. The InviteSession::makeInfo
method was deprecated sometime ago and replace by the InviteSession::info
method. There have been problems in older releases
of the stack surrounding TID generation on Windows platforms. These revolve around
the fact that you must seed the random number generator in each thread that
generates random numbers. TIDs are generated from the send() call, so if you
are calling send from multiple threads, then this could be a problem. Note:
This has been addressed in the SVN head, by ensuring each thread in windows is
seeded correctly. Hope this helps. Scott From:
resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxx
[mailto:resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Keohane, Stephen Hello, I'm stuck on a problem using DUM to send sequential INFO
response/requests after I have established a call. I'm seeing a transaction Id reused in requests which causes
the response not to be sent up to the application layer. Essentially, I have multiple threads that request a
singleton object (SipH) to create and send Info messages to a UAS. When I
receive a response from the INFO, I process it from another thread which has
the dum->process(fdset); The method which has the dum->process() is mutexed with
the methods that create requests. Here is the code snippet which creates the requests: try { std::auto_ptr<resip::Contents> contents(new
resip::PlainContents(message.c_str())); resip::SipMessage& infoMessage =
pep->inviteSession()->makeInfo(contents); TRACE("SipH::sendInfo() -- ",
infoMessage.brief().c_str()); pep->inviteSession()->send(infoMessage); } catch(resip::BaseException& be) {} Each call object (pep) keeps its own inviteSession. In my
scenario I am only running one call. The requests are a couple of seconds apart
- the UAS responds almost immediately. My log format is seconds:thread:Class:method() –
message and I am using SIpMessage::brief() here. Here is the pertinent info from my log: 1126822932:2528:SipH::sendInfo() -- SipReq: INFO
admin@xxxxxxxxxx:5060 tid=eb01e926a62eb30b cseq=INFO contact=administrator / 2
from(tu) 1126822932:3876:SipInviteSessionHandler::onInfoSuccess()
-- SipResp: 200 tid=3c15db120c39877e cseq=INFO / 2 from(wire) 1126822935:2856:SipH::sendInfo() -- SipReq: INFO
admin@xxxxxxxxxx:5060 tid=234829008467be18 cseq=INFO contact=administrator / 3
from(tu) 1126822935:3876:SipInviteSessionHandler::onInfoSuccess()
-- SipResp: 200 tid=6c3de14aae72d62c cseq=INFO / 3 from(wire) 1126822937:3684:SipH::sendInfo() -- SipReq: INFO
admin@xxxxxxxxxx:5060 tid=234829008467be18 cseq=INFO contact=administrator / 4 from(tu) The reSIProcate logs look fine - they essentially tell the
same story. The duplicate tid shows up first from Dialog::makeRequest and it is
not clear to me how it obtains a transaction id. I've created a test program based on basicCall and it processes
requests/responses without incident. The onAnswer sends a infoMessage and the
onInfoSuccess sends infoMessages. It might be a rather brutal test but it
works. Here is the OnAnswer and OnInfoSuccess: virtual void onAnswer(InviteSessionHandle is, const
SipMessage& msg, const SdpContents*sdp) { cout << name << ":
InviteSession-onAnswer(SDP)" << endl; std::string myMsg("Message One"); std::auto_ptr<resip::Contents> contents(new
resip::PlainContents(myMsg.c_str())); resip::SipMessage& infoMessage =
is->makeInfo(contents); is->send(infoMessage); } virtual void onInfoSuccess(InviteSessionHandle is, const
SipMessage& msg) { cout << name << ":
InviteSession-onInfoSuccess - " << msg.brief() << endl; std::string myMsg("Message Two"); std::auto_ptr<resip::Contents> contents(new
resip::PlainContents(myMsg.c_str())); resip::SipMessage& infoMessage =
is->makeInfo(contents); is->send(infoMessage); } Am I doing something stupid? It wouldn't be the first time. Any
help or advice would be greatly appreciated. Thanks, Stephen Keohane |