List of usage examples for org.apache.commons.net.tftp TFTPDataPacket getDataLength
public int getDataLength()
From source file:org.jnode.net.ipv4.tftp.TFTPServer.java
private void processRequest(TFTPPacket packet) throws IOException { if (log.isDebugEnabled()) log.debug("Received packet: " + packet.getAddress() + ':' + packet.getPort()); final int type = packet.getType(); switch (type) { case TFTPPacket.WRITE_REQUEST: if (clientAddress == null) { TFTPWriteRequestPacket wreqPacket = (TFTPWriteRequestPacket) packet; File file = new File(".", wreqPacket.getFilename()); log.info("Request to write file " + wreqPacket.getFilename() + " (" + file.getAbsolutePath() + ") received from " + packet.getAddress() + ':' + packet.getPort()); fileOut = new FileOutputStream(file); blockNumber = 0;/* w w w. jav a 2 s . c o m*/ bufferedSend(new TFTPAckPacket(packet.getAddress(), packet.getPort(), blockNumber)); clientAddress = packet.getAddress(); clientPort = packet.getPort(); } break; case TFTPPacket.DATA: if (packet.getAddress().equals(clientAddress) && packet.getPort() == clientPort) { TFTPDataPacket dataPacket = (TFTPDataPacket) packet; // if client sent next block if (dataPacket.getBlockNumber() == blockNumber + 1) { fileOut.write(dataPacket.getData(), dataPacket.getDataOffset(), dataPacket.getDataLength()); // send acknowledgement bufferedSend( new TFTPAckPacket(packet.getAddress(), packet.getPort(), dataPacket.getBlockNumber())); blockNumber++; // if last block then end of transfer if (dataPacket.getDataLength() < TFTPDataPacket.MAX_DATA_LENGTH) { clientAddress = null; clientPort = 0; fileOut.close(); } } } break; case TFTPPacket.READ_REQUEST: if (clientAddress == null) { TFTPReadRequestPacket rreqPacket = (TFTPReadRequestPacket) packet; try { File file = new File(".", rreqPacket.getFilename()); log.info("Request to read file " + rreqPacket.getFilename() + " (" + file.getAbsolutePath() + ") received from " + packet.getAddress() + ':' + packet.getPort()); fileIn = new FileInputStream(file); blockNumber = 1; byte[] data = new byte[TFTPDataPacket.MAX_DATA_LENGTH]; final int bytesRead = fileIn.read(data); bufferedSend(new TFTPDataPacket(packet.getAddress(), packet.getPort(), blockNumber, data, 0, bytesRead)); // if more blocks to send if (bytesRead == TFTPDataPacket.MAX_DATA_LENGTH) { clientAddress = packet.getAddress(); clientPort = packet.getPort(); } else { fileIn.close(); } } catch (FileNotFoundException ex) { bufferedSend(new TFTPErrorPacket(packet.getAddress(), packet.getPort(), TFTPErrorPacket.FILE_NOT_FOUND, ex.getMessage())); } } break; case TFTPPacket.ACKNOWLEDGEMENT: if (packet.getAddress().equals(clientAddress) && packet.getPort() == clientPort) { TFTPAckPacket ackPacket = (TFTPAckPacket) packet; // if client acknowledged last block if (ackPacket.getBlockNumber() == blockNumber) { // send next block byte[] data = new byte[TFTPDataPacket.MAX_DATA_LENGTH]; final int bytesRead = fileIn.read(data); blockNumber++; bufferedSend(new TFTPDataPacket(packet.getAddress(), packet.getPort(), blockNumber, data, 0, bytesRead)); // if last block then end of transfer if (bytesRead < TFTPDataPacket.MAX_DATA_LENGTH) { clientAddress = null; clientPort = 0; fileIn.close(); } } } break; } }