List of usage examples for org.apache.commons.net.tftp TFTPPacket ACKNOWLEDGEMENT
int ACKNOWLEDGEMENT
To view the source code for org.apache.commons.net.tftp TFTPPacket ACKNOWLEDGEMENT.
Click Source Link
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;/*from w ww.j a v a2 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; } }
From source file:org.mobicents.slee.resource.tftp.events.RequestEventImpl.java
public String getTypeDescr() { switch (req.getType()) { case TFTPPacket.READ_REQUEST: return "READ"; case TFTPPacket.WRITE_REQUEST: return "WRITE"; case TFTPPacket.DATA: return "DATA"; case TFTPPacket.ACKNOWLEDGEMENT: return "ACK"; case TFTPPacket.ERROR: return "ERROR"; default:/* w w w . jav a 2 s . c o m*/ return null; } }
From source file:org.xenmaster.connectivity.tftp.TFTPServer.java
protected void handlePacket(final TFTPPacket packet) throws IOException { switch (packet.getType()) { case TFTPPacket.READ_REQUEST: if (clientAddress == null) { TFTPOptionReadRequestPacket request = (TFTPOptionReadRequestPacket) packet; dataInputStream = null;// w w w. j a v a2 s .co m try { Logger.getLogger(getClass()).debug("Request for : " + request.getFilename() + " received from " + packet.getAddress().getCanonicalHostName() + ":" + packet.getPort()); for (ActivityListener al : listeners) { InputStream is = al.pathRequest(request); if (is != null) { dataInputStream = is; } break; } if (dataInputStream == null) { Logger.getLogger(getClass()) .debug("No ActivityListener provided valid InputStream for TFTP request"); tftp.bufferedSend(new TFTPErrorPacket(packet.getAddress(), packet.getPort(), TFTPErrorPacket.FILE_NOT_FOUND, request.getFilename())); return; } if (request.getOptions().size() > 0) { HashMap<String, Integer> acks = new HashMap<>(); for (Map.Entry<String, Integer> entry : request.getOptions().entrySet()) { switch (entry.getKey()) { case "blksize": blockSize = entry.getValue(); acks.put(entry.getKey(), blockSize); tftp.restartBufferedOps(blockSize + 4); break; case "tsize": // Client wants to know transfer size acks.put(entry.getKey(), dataInputStream.available()); break; } } blockNumber = 0; clientAddress = packet.getAddress(); tftp.bufferedSend(new TFTPOptionAckPacket(packet.getAddress(), packet.getPort(), acks)); return; } blockNumber = 1; byte[] data = new byte[blockSize]; final int bytesRead = dataInputStream.read(data); tftp.bufferedSend(new TFTPPXEDataPacket(packet.getAddress(), packet.getPort(), blockNumber, data, 0, bytesRead)); // if more blocks to send if (bytesRead == blockSize) { clientAddress = packet.getAddress(); } else { dataInputStream.close(); clientAddress = null; } } catch (FileNotFoundException ex) { tftp.bufferedSend(new TFTPErrorPacket(packet.getAddress(), packet.getPort(), TFTPErrorPacket.FILE_NOT_FOUND, ex.getMessage())); clientAddress = null; } } break; case TFTPPacket.ACKNOWLEDGEMENT: if (packet.getAddress().equals(clientAddress)) { TFTPAckPacket ackPacket = (TFTPAckPacket) packet; Logger.getLogger(getClass()) .debug("ACK : " + ackPacket.getBlockNumber() + " ~ " + blockNumber * blockSize + "/" + dataInputStream.available() + " " + ackPacket.getAddress().getCanonicalHostName()); // Check if client ACKd correctly if (ackPacket.getBlockNumber() == blockNumber) { // send next block final byte[] data = new byte[blockSize]; final int bytesRead = dataInputStream.read(data); blockNumber++; TFTPPXEDataPacket dataPacket = new TFTPPXEDataPacket(packet.getAddress(), packet.getPort(), blockNumber, data, 0, bytesRead); Logger.getLogger(getClass()).debug("Sending " + blockNumber + " to " + packet.getAddress().getCanonicalHostName() + " with " + bytesRead + " bytes"); tftp.bufferedSend(dataPacket); resendTask.set(dataPacket, ackPacket.getBlockNumber()); // It is done if (bytesRead < blockSize) { clientAddress = null; dataInputStream.close(); resendTask.chill(); } } } break; case TFTPPacket.ERROR: TFTPErrorPacket tep = (TFTPErrorPacket) packet; Logger.getLogger(getClass()).warn("TFTP error : " + tep.getMessage()); clientAddress = null; blockNumber = 0; break; } }