Echo Server based on the legacy EthernetNetIf libraries used for a performance comparison with the new networking libraries

Dependencies:   EthernetNetIf mbed

Fork of EchoServer by ryosuke kojima

Committer:
emilmont
Date:
Wed Aug 01 16:25:14 2012 +0000
Revision:
1:7b4661a721c1
Parent:
0:fcd581e3ad7d
Echo Server based on the legacy EthernetNetIf libraries used for a performance comparison with the new networking libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
naegawa 0:fcd581e3ad7d 1 #include "TCPEchoHandler.h"
naegawa 0:fcd581e3ad7d 2
naegawa 0:fcd581e3ad7d 3 // When the constructor's called, initialise the member variables
naegawa 0:fcd581e3ad7d 4 TCPEchoHandler::TCPEchoHandler(TCPSocket* tcpClientSocket)
naegawa 0:fcd581e3ad7d 5 : NetService()
naegawa 0:fcd581e3ad7d 6 , clientSocket(tcpClientSocket)
naegawa 0:fcd581e3ad7d 7 , closed(0)
naegawa 0:fcd581e3ad7d 8 , timeoutWatchdog() {
naegawa 0:fcd581e3ad7d 9 // Wire up the event handler on the client TCP socket
naegawa 0:fcd581e3ad7d 10 clientSocket->setOnEvent(this, &TCPEchoHandler::onTCPSocketEvent);
naegawa 0:fcd581e3ad7d 11 }
naegawa 0:fcd581e3ad7d 12
naegawa 0:fcd581e3ad7d 13 TCPEchoHandler::~TCPEchoHandler() {
naegawa 0:fcd581e3ad7d 14 // Close the socket on destruction
naegawa 0:fcd581e3ad7d 15 close();
naegawa 0:fcd581e3ad7d 16 }
naegawa 0:fcd581e3ad7d 17
naegawa 0:fcd581e3ad7d 18 void TCPEchoHandler::onTCPSocketEvent(TCPSocketEvent e) {
naegawa 0:fcd581e3ad7d 19 switch (e) {
naegawa 0:fcd581e3ad7d 20 // If the socket is readable, do stuff
naegawa 0:fcd581e3ad7d 21 case TCPSOCKET_READABLE:
naegawa 0:fcd581e3ad7d 22 // Disable the timeout watchdog timer
naegawa 0:fcd581e3ad7d 23 timeoutWatchdog.detach();
naegawa 0:fcd581e3ad7d 24 // Read in any available data into the buffer
naegawa 0:fcd581e3ad7d 25 char buff[128];
naegawa 0:fcd581e3ad7d 26 while ( int len = clientSocket->recv(buff, 128) ) {
naegawa 0:fcd581e3ad7d 27 // And send straight back out again
naegawa 0:fcd581e3ad7d 28 clientSocket->send(buff, len);
naegawa 0:fcd581e3ad7d 29 }
naegawa 0:fcd581e3ad7d 30 // Reset timeout countdown
naegawa 0:fcd581e3ad7d 31 setTimeout(ECHO_TIMEOUT);
naegawa 0:fcd581e3ad7d 32 break;
naegawa 0:fcd581e3ad7d 33 case TCPSOCKET_CONTIMEOUT:
naegawa 0:fcd581e3ad7d 34 case TCPSOCKET_CONRST:
naegawa 0:fcd581e3ad7d 35 case TCPSOCKET_CONABRT:
naegawa 0:fcd581e3ad7d 36 case TCPSOCKET_ERROR:
naegawa 0:fcd581e3ad7d 37 case TCPSOCKET_DISCONNECTED:
naegawa 0:fcd581e3ad7d 38 // Close the socket on any terminal TCP event
naegawa 0:fcd581e3ad7d 39 close();
naegawa 0:fcd581e3ad7d 40 break;
naegawa 0:fcd581e3ad7d 41 }
naegawa 0:fcd581e3ad7d 42
naegawa 0:fcd581e3ad7d 43 }
naegawa 0:fcd581e3ad7d 44
naegawa 0:fcd581e3ad7d 45 void TCPEchoHandler::close() {
naegawa 0:fcd581e3ad7d 46 // Prevent recursive calling or calling on an object being destructed by someone else
naegawa 0:fcd581e3ad7d 47 if ( closed )
naegawa 0:fcd581e3ad7d 48 return;
naegawa 0:fcd581e3ad7d 49 closed = 1;
naegawa 0:fcd581e3ad7d 50 timeoutWatchdog.detach();
naegawa 0:fcd581e3ad7d 51 if ( clientSocket ) {
naegawa 0:fcd581e3ad7d 52 clientSocket->resetOnEvent();
naegawa 0:fcd581e3ad7d 53 clientSocket->close();
naegawa 0:fcd581e3ad7d 54 delete clientSocket; //This fn might have been called by this socket (through an event), so DO NOT DESTROY IT HERE
naegawa 0:fcd581e3ad7d 55 }
naegawa 0:fcd581e3ad7d 56 // Flags this service as closed - will be destructed and deleted on
naegawa 0:fcd581e3ad7d 57 // the next call of NetService::poll() by Net::poll()
naegawa 0:fcd581e3ad7d 58 NetService::close();
naegawa 0:fcd581e3ad7d 59 }
naegawa 0:fcd581e3ad7d 60
naegawa 0:fcd581e3ad7d 61 void TCPEchoHandler::setTimeout(unsigned int timeout) {
naegawa 0:fcd581e3ad7d 62 // Attach our timeout handler to the timeout watchdog timer to close the socket if no activity
naegawa 0:fcd581e3ad7d 63 timeoutWatchdog.attach_us<TCPEchoHandler>(this, &TCPEchoHandler::onTimeout, ECHO_TIMEOUT * 1000);
naegawa 0:fcd581e3ad7d 64 }
naegawa 0:fcd581e3ad7d 65
naegawa 0:fcd581e3ad7d 66 void TCPEchoHandler::onTimeout() {
naegawa 0:fcd581e3ad7d 67 // Nothing fancy, just close the socket and mark this class for destruction
naegawa 0:fcd581e3ad7d 68 close();
naegawa 0:fcd581e3ad7d 69 }