Re: Re: about stun4j in jain-sip 1.2
"M. Ranganathan" <[email protected]>
| Newsgroups | gmane.comp.voip.nist-sip |
|---|---|
| Message-ID | <[email protected]> |
Man-Chi Leung wrote:
> hi,
>
> i do have the following doubt, pls help!
>
> 1) when should I start running stun4j ?
> it seems that I must start stun4j before [Step 2] :
> Line: udpListeningPoint = sipStack.createListeningPoint(PRIVATE_IP,
> PRIVATE_PORT,transport);
> bcos, this line will bind the address (e.g. 10.0.0.1:5060). stun4j
> will not able to bind the same address (10.0.0.1:5060) after this line!!
>
>
> 2) when should I stop running stun4j ?
>
> i must explicitly call addressDiscovery.shutDown(); before [Step 2] ,
> otherwise sipstack will fail to bind address & throw exception at
> [Step 2]
>
> 3) is my implementation correct?
> [1st UDP session at NAT]
> -> run stun4j
> -> detect public address
> -> shutdown stun4j
Why shutdown stun4j?
> [2nd UDP session at NAT]
> -> createListeningPoint via sipstack
> -> set Via & contact address
> -> send request
>
> now, i have problem on re-running stun4j multiple times for KeepAlive.
> how should I do it in jain-sip?
You can periodically send a zero length request (note that facitlity in
RequestFactory). This will send a zero length SIP message to keep the
mapping alive. Of course the receiver will just drop the message because
it is invalid ( and hopefully he will be kind enough to let you keep
pinging him).
>
> btw, i also checked sip-communicator (in both old and new1.0 version).
> i could not find any actual integration of stun4j beside using stun4j
> as a diagnostic tool for debugging.
> did i miss anything? pls advise on any example and tutorial guide on
> this area. anyone has a good example? can u share with me?
>
> ~manchi
>
> -----------------------------------------------------------
> for stun4j with jain-sip 1.2, I did the following:
> -----------------------------------------------------------
> //
> // create a method to use stun4j API
> //
> private void setPublicAddress() {
>
> StunAddress localAddr = new
> StunAddress(InetAddress.getLocalHost(),PRIVATE_IP);
>
> StunAddress serverAddr serverAddr = new
> StunAddress(STUN_SERVER_IP, STUN_SERVER_PORT);
> NetworkConfigurationDiscoveryProcess addressDiscovery = new
> NetworkConfigurationDiscoveryProcess(
> localAddr, serverAddr);
>
> addressDiscovery.start();
>
> StunDiscoveryReport stunReport stunReport =
> addressDiscovery.determineAddress();
>
> StunAddress stunAddress = stunReport.getPublicAddress();
>
> //
> // overwrite class field for PUBLIC_IP and PUBLC_PORT with
> public address detected from stun4j
> //
> this.PUBLIC_IP = stunAddress.getHostAddress();
> this.PUBLIC_PORT = stunAddress.getPort();
>
> // need to shutdown stun process, otherwise, stun4j is holding
> port
> addressDiscovery.shutDown();
> }
>
> public void sendRegister() {
> //
> // [ Step 1 ] run setPublicAddress() to set PUBLIC_IP &
> PUBLIC_PORT with stun4j
> //
> this.setPublicAddress();
> ....
>
> //
> // [ Step 2 ] to avoid verfiication check by sip-stack-imp,
> // create listening point with private address first,
> // then use setSentBy to replace with public address.
> //
> udpListeningPoint = sipStack.createListeningPoint(PRIVATE_IP,
> PRIVATE_PORT,transport);
> udpListeningPoint.setSentBy(PUBLIC_IP + ":" + PUBLIC_PORT);
>
> //
> // [ Step 3 ] create ViaHeaders with public address
> //
> ArrayList viaHeaders = new ArrayList();
> ViaHeader viaHeader =
> headerFactory.createViaHeader(PUBLIC_IP,PUBLIC_PORT, transport, null);
> viaHeaders.add(viaHeader);
>
> //
> // [ Step 4 ] Create and add the contact name address
> // with public address
> //
> SipURI contactURI =
> addressFactory.createSipURI(fromUserName,PUBLIC_IP);
> contactURI.setPort(PUBLIC_PORT);
> Address contactAddress = addressFactory.createAddress(contactURI);
> contactAddress.setDisplayName(fromUserName);
> ContactHeader contactHeader =
> headerFactory.createContactHeader(contactAddress);
> request.addHeader(contactHeader);
>
> ...
> clientTransaction.sendRequest();
> ....
> }
>
> On 2006-06-13 19:44:11 +0800, "M. Rangnathan" <[email protected]> said:
>
>> Man-Chi Leung wrote:
>>
>>> hi,
>>>
>>> ----------------------------------------------
>>> in jain-sip 1.1 CVS source,
>>> ----------------------------------------------
>>> I found info about stun4j in /docs/faq.html
>>>
>>> How do you enable/use the STUN support?
>>> set the gov.nist.javax.sip.STUN_SERVER to point to
>>> stun_server_ip_address[:port] where your stun server resides. The
>>> stack will return mapped address when you getIpAddress() from the
>>> stack and getPort() from the listening point. With stun, if you have
>>> a NAT box, these will in general be different from the IP address
>>> and port used to create the LP. Your application needs to use these
>>> in setting up the contact address and SDP parameters as appropriate.
>>> The stack is not responsible for this.
>>>
>>>
>>> ----------------------------------------------
>>> in jain-sip 1.2 CVS source
>>> ----------------------------------------------
>>> i found the following snippet in Class
>>> "gov.nist.javax.sip.SIPStackImpl.java"
>>>
>>> String stunAddr = configurationProperties
>>> .getProperty("gov.nist.javax.sip.STUN_SERVER");
>>>
>>> if ( stunAddr != null )
>>> this.logWriter.logWarning("Ignoring obsolete property "
>>> + "gov.nist.javax.sip.STUN_SERVER");
>>>
>>> -----------------------
>>> my Question:
>>> -----------------------
>>> is stun4j totally ignored by jain-sip 1.2 ?
>>
>>
>>
>> Totally and absolutely ignored. :-) Stun was never part of JAIN-SIP.
>> The previous version had some Stun support in the RI. It was deemed
>> unecessary and therefore removed.
>>
>>>
>>>
>>> so idea is to just call Stun's API from my jain-sip client, am i
>>> correct?
>>> - get public address from Stun4j's
>>> addressDiscovery.determineAddress();
>>> - set public address in Via using API Jain-SIP's
>>> headerFactory.createViaHeader()
>>
>>
>>
>> Set the sentBy on your Listening point. See ListeningPoint.setSentBy()
>> Set the public address in Via.
>>
>> If you dont do the former, the RI will throw an exception. It does a
>> little integrity check.
>>
>> This may not be relevant to you but there is now an AddressResolver
>> (only part of the RI and not the spec). When the reciever gets a
>> message it checks the via header to see if it can resolve the
>> address. To do this it uses the AddressResolver. If the address
>> cannot be resolved the message is dropped. Just a little security and
>> integrity feature that I thought people might find useful. Also a way
>> to deal with DNS SRV record lookups that the stack does not implement
>> ( you can implement this Interface and register with the stack).
>>
>>> - set public address in Contact using API Jain-SIP's
>>> addressFactory.createAddress(contactURI);
>>
>>
>> Yes
>>
>>> - set public address and port for SDP c= attribute.
>>
>>
>>
>> Yes.
>>
>>>
>>> ~manchi
>>>
>>>
>>>
>>> _______________________________________________
>>> nist-sip mailing list
>>> [email protected]
>>> http://www-x.antd.nist.gov/mailman/listinfo/nist-sip
>>
>
>
>
> _______________________________________________
> nist-sip mailing list
> [email protected]
> http://www-x.antd.nist.gov/mailman/listinfo/nist-sip
>
--
M. Ranganathan
Advanced Networking Technologies Division,
National Institute of Standards and Technology (NIST),
100 Bureau Drive, Stop 8920, Gaithersburg, MD 20899.
tel:301 975 3664 , fax:301 590 0932 http://w3.antd.nist.gov/
Advanced Networking Technologies For the People!