Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Please help me to complete this code please

Posted on 2004-04-07
13
Medium Priority
?
266 Views
Last Modified: 2008-02-01
Hi
I wonder if anybody could help me.I desprately need help

Please have a look the following code :-
import java.io.*;
import java.net.*;

class TypeConvertion
{
  //Get a short integer from two bytes with offset in the buf
  public static short getShort(byte[] buf, int offset)
  {
    int high = buf[offset] & 0xff;
    int low  = buf[offset+1] & 0xff;
    return (short)(high <<8 | low);
  }


  //Store a short integer to two bytes with offset in the buf
  public static void putShort(byte[] buf, int offset, short value)
  {
    byte low      = (byte)(value & 0xff);
    byte high     = (byte)(value>>8 & 0xff);
    buf[offset]   = high;
    buf[offset+1] = low;
    return;
  }
}


public class TFTPClient
{
   short        seqn;
   byte         outb[];
   byte         inb[];
   String       fname;  //The file name
   InetAddress  server; //sever&#8217;s IP address
   int                   sport;  //server&#8217;s port number

   DatagramPacket odp;
   DatagramPacket idp;
   DatagramSocket sock;

   TFTPClient(String sn, String sp, String fn) throws Exception
   {
      seqn   = 0;
      outb   = new byte[516];
      inb     = new byte[516];
      server = InetAddress.getByName(sn); //Get server&#8217;s IP
     
    //Convert port string to port number
     sport = Integer.parseInt(sp);
     
     fname = fn;
     idp     = new DatagramPacket(inb,inb.length);
   
    //Create Datagram Socket*/
     sock  = new DatagramSocket();

    }
      
   void SendACK() throws Exception
   {
     int index = 0;
 
    //Fill ACK opcode =0x0004 field
    TypeConversion.putShort(outb,index,(short)4);
    index + = 2;
   
    //Fill ACK SEQ field
    TypeConversion.putShort(buff,index,seqn);/*ACK SEQ*/
    index + =2;

    /*Generating ACK datagram packet*/
    /*...*/
 
 
    /*Send out the ACK datagram packet*/
    /*...*/
  }

   void SendRRQ() throws Exception
   {
    int index = 0;
      
    //Fill RRQ opcode = 0x0001 field
    TypeConversion.putShort(outb,index,(short)1);
    index + = 2;
      
    //Fill the file name field
    byte[] temp = fname.getBytes();
    for(int i = 0;i < temp.length;i++);
    outb [i + index] = temp[i];
  }
    index +      = temp.length;
    outb[index] = 0; //End of the file name
    index +       = 1;
      
    //Fill the file data mode, using octet mode
    String mode = "octet";
    temp        = mode.getBytes();

    for(int i = 0;i <temp.length; i++)
        {
        outb[i+index] = temp[i];
        }
   

     /*Fill the end indicator of the packet*/
     /*...*/
    /*Generating ACK packet*/
    /*...*/
    /*Send out the ACK packet*/
    /*...*/
}

    void getFile() throws Exception{
    /*Create a file*/
    /*...*/
    /*Using FileOutputStream to open the file*/
    /*...*/
    int opcode;
    short rseq;
    int length;
    /*Send RRQ packet*/
    /*...*/
    while(true)
      {
    /*Receive the packet to idp from the server*/
    /*...*/
   /*Get OPCODE from the packet*/
   opcode=TypeConvertion.getShort(inb,0);
   if(opcode!=0x0003){ /*DATA*/
   continue;
}
  /*Get SEQ from the packet*/
  rseq   = TypeConvertion.getShort(inb,2);
  if(rseq==seqn+1){/*it is a new packet*/
  /*We don't check the server's IP address*/
  /*Store the data into file*/
  fos.write(inb,4,length-4);
  seqn=rseq;
  /*Send ACK*/
  /*...*/
 if(length<516){/*check end of the file*/
 sock.close();
 fos.close();
 return;
}
continue;
}
if(rseq==seqn){ /*duplicated copy*/
/*Acknowledge the received packet again*/
/*...*/


continue;
}
/*error sequence, do nothing*/
}
}
public void main(String args[]) throws Exception{
if(args.length!=3){
System.out.println("Usage: TFTPClient <servername>
<port> <filename>");
return;
}
TFTPClient tftp=new TFTPClient(args[0],args[1],args[2]);
tftp.getFile();
}
}

This is a simple  TFTP client whose function is to retrive the file from the TFTP server and store in a local file.Could anybody please fill the empty parts under the comments.(/*.......*/)


Thank you

0
Comment
Question by:Rafi-muqaddar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
13 Comments
 
LVL 30

Accepted Solution

by:
Mayank S earned 1000 total points
ID: 10773708
>> Could anybody please fill the empty parts under the comments

There are too many of them. Is this homework?

Anyway, some examples here to help you code that on your own:

Datagram receiving - http://www.javaalmanac.com/egs/java.net/ReceiveDatagram.html

Datagram sending - http://www.javaalmanac.com/egs/java.net/SendDatagram.html

Files - http://www.javaalmanac.com/cgi-bin/search/find.pl?words=File
0
 

Author Comment

by:Rafi-muqaddar
ID: 10774007
Thank you for your reply.
Just Tell me how to write Acknowledgement datagram packet in terms of this program.
0
 
LVL 30

Expert Comment

by:Mayank S
ID: 10774044
Well, you would be the best person to write that because you would know what is the 'format' of the acknowledgement to be sent. Have a look at the Datagram sending example that I sent. You can create an array of bytes depending upon the format the of acknowledgement and pass it to the method there in the outbuf[] argument.

Something like:

String sAck = "<ACK>This is the Acknowledgement</ACK>" ;
byte[] buf = sAck.getBytes () ;
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 13

Assisted Solution

by:Webstorm
Webstorm earned 1000 total points
ID: 10774060
Hi Rafi-muqaddar,

First correction :

  public static short getShort(byte[] buf, int offset)
  {
    short high = (short)buf[offset] & 0xff;
    short low  = (short)buf[offset+1] & 0xff;
    return (short)((high << 8) | low);
  }

0
 
LVL 13

Expert Comment

by:Webstorm
ID: 10774372
Second correction :

   for(int i = 0;i < temp.length;i++);
    outb [i + index] = temp[i];
  }

Should be :

   for(int i = 0;i < temp.length;i++){
    outb [i + index] = temp[i];
  }

or

   for(int i = 0;i < temp.length;i++)
    outb [i + index] = temp[i];
0
 
LVL 13

Expert Comment

by:Webstorm
ID: 10774391
Simplification :

Replace :

   for(int i = 0;i < temp.length;i++)
    outb [i + index] = temp[i];

    index +      = temp.length;
    outb[index] = 0; //End of the file name
    index +       = 1;

By :

   for(int i = 0;i < temp.length;i++)
       outb [index++] = temp[i];
   outb [index++] = 0; //End of the file name

0
 
LVL 13

Expert Comment

by:Webstorm
ID: 10774441
  String mode = "octet";
    temp        = mode.getBytes();

    for(int i = 0;i <temp.length; i++)
       {
        outb[i+index] = temp[i];
       }

--->

   String mode = "octet";
    temp        = mode.getBytes();

    for(int i = 0;i <temp.length; i++)
        outb[index++] = temp[i];

    /* send the packet (index = length) */
    sock.sendPacket(new DatagramPacket(outb, index, server_adr, server_port));
    /* server_adr is InetAddress of TFTP server */

http://java.sun.com/j2se/1.4.2/docs/api/java/net/DatagramSocket.html
http://java.sun.com/j2se/1.4.2/docs/api/java/net/DatagramPacket.html

0
 
LVL 30

Expert Comment

by:Mayank S
ID: 10958593
Split: Webstorm and mayankeagle.
0
 
LVL 13

Expert Comment

by:Webstorm
ID: 10958920
>> Split: Webstorm and mayankeagle.
I agree this suggestion.
0
 
LVL 30

Expert Comment

by:Mayank S
ID: 11047620
Please proceed with that recommendation.
0

Featured Post

[Webinar] Lessons on Recovering from Petya

Skyport is working hard to help customers recover from recent attacks, like the Petya worm. This work has brought to light some important lessons. New malware attacks like this can take down your entire environment. Learn from others mistakes on how to prevent Petya like worms.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
Viewers learn about the third conditional statement “else if” and use it in an example program. Then additional information about conditional statements is provided, covering the topic thoroughly. Viewers learn about the third conditional statement …
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
Suggested Courses

721 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question