Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TCPEchoHandler.cpp@0:b6a536e40b5d, 2012-06-20 (annotated)
- Committer:
- dfukumori
- Date:
- Wed Jun 20 22:16:31 2012 +0000
- Revision:
- 0:b6a536e40b5d
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dfukumori | 0:b6a536e40b5d | 1 | #include "TCPEchoHandler.h" |
dfukumori | 0:b6a536e40b5d | 2 | |
dfukumori | 0:b6a536e40b5d | 3 | |
dfukumori | 0:b6a536e40b5d | 4 | char* screenBufB; |
dfukumori | 0:b6a536e40b5d | 5 | int n = 0; |
dfukumori | 0:b6a536e40b5d | 6 | extern int bytes_received; |
dfukumori | 0:b6a536e40b5d | 7 | extern bool drawReadyFlag; |
dfukumori | 0:b6a536e40b5d | 8 | extern bool networkFlag; |
dfukumori | 0:b6a536e40b5d | 9 | |
dfukumori | 0:b6a536e40b5d | 10 | #define SCRBUFSIZE 1440 |
dfukumori | 0:b6a536e40b5d | 11 | |
dfukumori | 0:b6a536e40b5d | 12 | // When the constructor's called, initialise the member variables |
dfukumori | 0:b6a536e40b5d | 13 | TCPEchoHandler::TCPEchoHandler(TCPSocket* tcpClientSocket, char* scrbuf) |
dfukumori | 0:b6a536e40b5d | 14 | : NetService() |
dfukumori | 0:b6a536e40b5d | 15 | , clientSocket(tcpClientSocket) |
dfukumori | 0:b6a536e40b5d | 16 | , closed(0) |
dfukumori | 0:b6a536e40b5d | 17 | , timeoutWatchdog() { |
dfukumori | 0:b6a536e40b5d | 18 | // Wire up the event handler on the client TCP socket |
dfukumori | 0:b6a536e40b5d | 19 | clientSocket->setOnEvent(this, &TCPEchoHandler::onTCPSocketEvent); |
dfukumori | 0:b6a536e40b5d | 20 | screenBufB = scrbuf; |
dfukumori | 0:b6a536e40b5d | 21 | } |
dfukumori | 0:b6a536e40b5d | 22 | |
dfukumori | 0:b6a536e40b5d | 23 | TCPEchoHandler::~TCPEchoHandler() { |
dfukumori | 0:b6a536e40b5d | 24 | // Close the socket on destruction |
dfukumori | 0:b6a536e40b5d | 25 | close(); |
dfukumori | 0:b6a536e40b5d | 26 | } |
dfukumori | 0:b6a536e40b5d | 27 | |
dfukumori | 0:b6a536e40b5d | 28 | void TCPEchoHandler::onTCPSocketEvent(TCPSocketEvent e) { |
dfukumori | 0:b6a536e40b5d | 29 | //printf("socketevent %i\r\n", (int) e); |
dfukumori | 0:b6a536e40b5d | 30 | switch (e) { |
dfukumori | 0:b6a536e40b5d | 31 | // If the socket is readable, do stuff |
dfukumori | 0:b6a536e40b5d | 32 | case TCPSOCKET_READABLE: { |
dfukumori | 0:b6a536e40b5d | 33 | timeoutWatchdog.detach(); |
dfukumori | 0:b6a536e40b5d | 34 | //printf("starting read\r\n"); |
dfukumori | 0:b6a536e40b5d | 35 | int len = 0; |
dfukumori | 0:b6a536e40b5d | 36 | while (len = clientSocket->recv(&screenBufB[bytes_received], 1440 - bytes_received)) { |
dfukumori | 0:b6a536e40b5d | 37 | //printf("len: %d\r\n", len); |
dfukumori | 0:b6a536e40b5d | 38 | bytes_received += len; |
dfukumori | 0:b6a536e40b5d | 39 | } |
dfukumori | 0:b6a536e40b5d | 40 | //printf("received: %d\r\n", bytes_received); |
dfukumori | 0:b6a536e40b5d | 41 | if (bytes_received >= 1440) { |
dfukumori | 0:b6a536e40b5d | 42 | //printf("setting draw flag\r\n"); |
dfukumori | 0:b6a536e40b5d | 43 | bytes_received = 0; |
dfukumori | 0:b6a536e40b5d | 44 | drawReadyFlag = true; |
dfukumori | 0:b6a536e40b5d | 45 | } |
dfukumori | 0:b6a536e40b5d | 46 | |
dfukumori | 0:b6a536e40b5d | 47 | // Reset timeout countdown |
dfukumori | 0:b6a536e40b5d | 48 | //printf("setting timeout"); |
dfukumori | 0:b6a536e40b5d | 49 | setTimeout(ECHO_TIMEOUT); |
dfukumori | 0:b6a536e40b5d | 50 | //close(); |
dfukumori | 0:b6a536e40b5d | 51 | //printf("breaking"); |
dfukumori | 0:b6a536e40b5d | 52 | break; |
dfukumori | 0:b6a536e40b5d | 53 | } |
dfukumori | 0:b6a536e40b5d | 54 | case TCPSOCKET_CONTIMEOUT: |
dfukumori | 0:b6a536e40b5d | 55 | case TCPSOCKET_CONRST: |
dfukumori | 0:b6a536e40b5d | 56 | case TCPSOCKET_CONABRT: |
dfukumori | 0:b6a536e40b5d | 57 | case TCPSOCKET_ERROR: |
dfukumori | 0:b6a536e40b5d | 58 | case TCPSOCKET_DISCONNECTED: { |
dfukumori | 0:b6a536e40b5d | 59 | // Close the socket on any terminal TCP event |
dfukumori | 0:b6a536e40b5d | 60 | printf("finished\r\n"); |
dfukumori | 0:b6a536e40b5d | 61 | close(); |
dfukumori | 0:b6a536e40b5d | 62 | break; |
dfukumori | 0:b6a536e40b5d | 63 | } |
dfukumori | 0:b6a536e40b5d | 64 | } |
dfukumori | 0:b6a536e40b5d | 65 | } |
dfukumori | 0:b6a536e40b5d | 66 | |
dfukumori | 0:b6a536e40b5d | 67 | void TCPEchoHandler::close() { |
dfukumori | 0:b6a536e40b5d | 68 | // Prevent recursive calling or calling on an object being destructed by someone else |
dfukumori | 0:b6a536e40b5d | 69 | if ( closed ) |
dfukumori | 0:b6a536e40b5d | 70 | return; |
dfukumori | 0:b6a536e40b5d | 71 | closed = 1; |
dfukumori | 0:b6a536e40b5d | 72 | timeoutWatchdog.detach(); |
dfukumori | 0:b6a536e40b5d | 73 | if ( clientSocket ) { |
dfukumori | 0:b6a536e40b5d | 74 | clientSocket->resetOnEvent(); |
dfukumori | 0:b6a536e40b5d | 75 | clientSocket->close(); |
dfukumori | 0:b6a536e40b5d | 76 | delete clientSocket; //This fn might have been called by this socket (through an event), so DO NOT DESTROY IT HERE |
dfukumori | 0:b6a536e40b5d | 77 | } |
dfukumori | 0:b6a536e40b5d | 78 | // Flags this service as closed - will be destructed and deleted on |
dfukumori | 0:b6a536e40b5d | 79 | // the next call of NetService::poll() by Net::poll() |
dfukumori | 0:b6a536e40b5d | 80 | NetService::close(); |
dfukumori | 0:b6a536e40b5d | 81 | } |
dfukumori | 0:b6a536e40b5d | 82 | |
dfukumori | 0:b6a536e40b5d | 83 | void TCPEchoHandler::setTimeout(unsigned int timeout) { |
dfukumori | 0:b6a536e40b5d | 84 | // Attach our timeout handler to the timeout watchdog timer to close the socket if no activity |
dfukumori | 0:b6a536e40b5d | 85 | //timeoutWatchdog.attach_us<TCPEchoHandler>(this, &TCPEchoHandler::onTimeout, ECHO_TIMEOUT * 1000); |
dfukumori | 0:b6a536e40b5d | 86 | } |
dfukumori | 0:b6a536e40b5d | 87 | |
dfukumori | 0:b6a536e40b5d | 88 | void TCPEchoHandler::onTimeout() { |
dfukumori | 0:b6a536e40b5d | 89 | // Nothing fancy, just close the socket and mark this class for destruction |
dfukumori | 0:b6a536e40b5d | 90 | close(); |
dfukumori | 0:b6a536e40b5d | 91 | } |