This is a simple but complete TFTP server, It can receive and send files and listens on port 69. It is part of the LaOS (Laser Open Source) project: http://www.laoslaser.org/
Dependents: TFTPServerTest RMFWeb
Diff: TFTPServer.h
- Revision:
- 0:3b0027b76acf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TFTPServer.h Mon Dec 26 18:18:32 2011 +0000 @@ -0,0 +1,113 @@ +/** + * TFTPServer.h + * Simple TFTP server + * + * Copyright (c) 2011 Jaap Vermaas + * + * This file is part of the LaOS project (see: http://wiki.laoslaser.org + * + * LaOS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LaOS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LaOS. If not, see <http://www.gnu.org/licenses/>. + * + * Minimal TFTP Server + * * Receive and send files via TFTP + * * Server handles only one transfer at a time + * * Supports only binary mode transfers, no (net)ascii + * * fixed block size: 512 bytes + * + * http://spectral.mscs.mu.edu/RFC/rfc1350.html + * + * Example: + * @code + * TFTPServer *srv; + * ... + * srv = new TFTPServer(); + * ... + * @endcode + * + */ + +#ifndef _TFTPSERVER_H_ +#define _TFTPSERVER_H_ + +#include <stdio.h> +#include <ctype.h> +#include "mbed.h" +#include "SDFileSystem.h" // http://mbed.org/users/NeoBelerophon/libraries/ChaNFSSD +#include "UDPSocket.h" // http://mbed.org/users/donatien/programs/EthernetNetIf + +#define TFTP_PORT 69 +//#define TFTP_DEBUG(x) printf("%s\n\r", x); + +enum TFTPServerState { listen, reading, writing, error, suspended, deleted }; + +class TFTPServer { + +public: + // create a new tftp server, with file directory dir and + // listening on port + TFTPServer(char* dir); + // destroy this instance of the tftp server + void reset(); + // reset socket + ~TFTPServer(); + // get current tftp status + TFTPServerState State(); + // Temporarily disable incoming TFTP connections + void suspend(); + // Resume after suspension + void resume(); + // During read and write, this gives you the filename + void getFilename(char* name); + // Return number of received files + int fileCnt(); + +private: + // create a new connection reading a file from server + void ConnectRead(char* infile, Host* client); + // create a new connection writing a file to the server + void ConnectWrite(char* infile, Host* client); + // get DATA block from file on disk into memory + void getBlock(); + // send DATA block to the client + void sendBlock(); + // handle special files + // anything called *.bin is written to /local/FIRMWARE.BIN + // anything called config.txt is written to /local/config.txt + // even if workdir is not /local + int cmpHost(Host* client); + // send ACK to remote + void Ack(int val); + // send ERR message to named client + void Err(char* msg, Host* client); + // check if connection mode of client is octet/binary + int modeOctet(char* buff); + // timed routine to avoid hanging after interrupted transfers + void cleanUp(); + // event driven routines to handle incoming packets + void onListenUDPSocketEvent(UDPSocketEvent e); + + UDPSocket* ListenSock; // main listening socket (dflt: UDP port 69) + char workdir[256]; // file working directory + TFTPServerState state; // current TFTP server state + Host* remote; // connected remote Host IP and Port + int blockcnt, dupcnt; // block counter, and DUP counter + FILE* fp; // current file to read or write + char sendbuff[516]; // current DATA block; + int blocksize; // last DATA block size while sending + char filename[256]; // current (or most recent) filename + Ticker TFTPServerTimer; // timeout timer + int filecnt; // received file counter +}; + +#endif