Solved

Please help me to complete this code please

Posted on 2004-04-07
13
248 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
  • 5
  • 4
13 Comments
 
LVL 30

Accepted Solution

by:
Mayank S earned 250 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
Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

 
LVL 13

Assisted Solution

by:Webstorm
Webstorm earned 250 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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
how to add new optional parameter to JSP 1 49
printf performancy 11 73
java example issue 5 26
Java class and jar 3 25
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…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

828 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