Example usage for org.apache.commons.net.tftp TFTPPacket getType

List of usage examples for org.apache.commons.net.tftp TFTPPacket getType

Introduction

In this page you can find the example usage for org.apache.commons.net.tftp TFTPPacket getType.

Prototype

public final int getType() 

Source Link

Document

Returns the type of the packet.

Usage

From source file:com.owera.xaps.spp.TFTPServer.java

public void run() {
    try {/*from  w w  w.j a v  a  2  s.c  o m*/
        while (!shutdownServer) {
            TFTPPacket tftpPacket;

            tftpPacket = serverTftp_.receive();
            if (tftpPacket == null)
                continue; // server is going down
            String msg = "TFTP request received: type=" + tftpPacket.getType();
            msg += ", from=" + tftpPacket.getAddress() + ":" + tftpPacket.getPort();
            Log.debug(TFTPServer.class, msg);

            TFTPTransfer tt = new TFTPTransfer(tftpPacket);
            synchronized (transfers_) {
                transfers_.add(tt);
            }

            Thread thread = new Thread(tt);
            thread.setDaemon(true);
            thread.start();
        }
    } catch (Exception e) {
        if (!shutdownServer) {
            serverException = e;
            Log.fatal(TFTPServer.class, "Unexpected Error in TFTP Server - Server shut down!", e);
        }
    } finally {
        shutdownServer = true; // set this to true, so the launching thread can
                               // check to see if it started.
        if (serverTftp_ != null && serverTftp_.isOpen()) {
            serverTftp_.close();
        }
    }
}

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  ww w  .ja  va  2s . co 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.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;//from   ww w.  ja v  a 2 s . com

            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;
    }
}