/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This source code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this source code; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package local.net; import org.zoolu.net.*; import org.zoolu.tools.Timer; import org.zoolu.tools.TimerListener; import java.util.Date; /** KeepAliveUdp thread, for keeping the connection up toward a target node * (e.g. toward the seriving proxy/gw or a remote UA). * It periodically sends keep-alive tokens in order to refresh NAT UDP session timeouts. * <p> It can be used for both signaling (SIP) or data plane (RTP/UDP). */ public class KeepAliveUdp extends Thread { /** Destination socket address (e.g. the registrar server) */ protected SocketAddress target; /** Time between two keep-alive tokens [millisecs] */ protected long delta_time; /** UdpSocket */ UdpSocket udp_socket; /** Udp packet */ UdpPacket udp_packet=null; /** Expiration date [millisecs] */ long expire=0; /** Whether it is running */ boolean stop=false; /** Creates a new KeepAliveUdp daemon */ protected KeepAliveUdp(SocketAddress target, long delta_time) { this.target=target; this.delta_time=delta_time; } /** Creates a new KeepAliveUdp daemon */ public KeepAliveUdp(UdpSocket udp_socket, SocketAddress target, long delta_time) { this.target=target; this.delta_time=delta_time; init(udp_socket,null); start(); } /** Creates a new KeepAliveUdp daemon */ public KeepAliveUdp(UdpSocket udp_socket, SocketAddress target, UdpPacket udp_packet, long delta_time) { this.target=target; this.delta_time=delta_time; init(udp_socket,udp_packet); start(); } /** Inits the KeepAliveUdp */ private void init(UdpSocket udp_socket, UdpPacket udp_packet) { this.udp_socket=udp_socket; if (udp_packet==null) { byte[] buff={(byte)'\r',(byte)'\n'}; udp_packet=new UdpPacket(buff,0,buff.length); } if (target!=null) { udp_packet.setIpAddress(target.getAddress()); udp_packet.setPort(target.getPort()); } this.udp_packet=udp_packet; } /** Whether the UDP relay is running */ public boolean isRunning() { return !stop; } /** Sets the time (in milliseconds) between two keep-alive tokens */ public void setDeltaTime(long delta_time) { this.delta_time=delta_time; } /** Gets the time (in milliseconds) between two keep-alive tokens */ public long getDeltaTime() { return delta_time; } /** Sets the destination SocketAddress */ public void setDestSoAddress(SocketAddress soaddr) { target=soaddr; if (udp_packet!=null && target!=null) { udp_packet.setIpAddress(target.getAddress()); udp_packet.setPort(target.getPort()); } } /** Gets the destination SocketAddress */ public SocketAddress getDestSoAddress() { return target; } /** Sets the expiration time (in milliseconds) */ public void setExpirationTime(long time) { if (time==0) expire=0; else expire=System.currentTimeMillis()+time; } /** Stops sending keep-alive tokens */ public void halt() { stop=true; } /** Sends the kepp-alive packet now. */ public void sendToken() throws java.io.IOException { // do send? if (!stop && target!=null && udp_socket!=null) { udp_socket.send(udp_packet); } } /** Main thread. */ public void run() { try { while(!stop) { sendToken(); //System.out.print("."); Thread.sleep(delta_time); if (expire>0 && System.currentTimeMillis()>expire) halt(); } } catch (Exception e) { e.printStackTrace(); } //System.out.println("o"); udp_socket=null; } /** Gets a String representation of the Object */ public String toString() { String str=null; if (udp_socket!=null) { str="udp:"+udp_socket.getLocalAddress()+":"+udp_socket.getLocalPort()+"-->"+target.toString(); } return str+" ("+delta_time+"ms)"; } }