import drcl.comp.Port; import drcl.comp.Contract; import drcl.inet.contract.DatagramContract; /** * Example application class - echoer. */ public class echoer extends drcl.net.Module { final static int REQ=1, RPL=2, tos=0; static { setContract(echoer.class, drcl.net.Module.PortGroup_DOWN + "@", new DatagramContract(Contract.Role_PEER)); } public echoer() { super(); } public echoer(String id_) { super(id_); } void sendmsg(int type_, double tm_, long dst_, int dport_) { echopkt pkt_ = new echopkt(type_, tm_); downPort.doSending(new DatagramContract.Message(pkt_, 10/*size*/, drcl.net.Address.NULL_ADDR, dst_, dport_, tos)); } public void send_echo_request(long dst_, int dport_) { debug("Sending an Echo packet to port " + dport_ + " at node" + dst_); sendmsg(REQ, getTime(), dst_, dport_); } protected void dataArriveAtDownPort(Object data_, Port downPort_) { if (!(data_ instanceof DatagramContract.Message)) { error(data_, "dataArrivedAtDownPort()", downPort_, "unrecognized data"); return; } DatagramContract.Message datagram_ = (DatagramContract.Message) data_; long src_ = datagram_.getSource(); int sport_ = datagram_.getSourcePort(); echopkt pkt_ = (echopkt)datagram_.getContent(); if (pkt_.type==RPL) { double rtt = getTime() - pkt_.time; debug("Getting a reply, round-trip time is: " + rtt); } else { debug("Getting a request, sending time is: " + pkt_.time); sendmsg(RPL, pkt_.time, src_, sport_); } } }