Machine Vision Status TCP Server

Dependencies:   C12832 EthernetInterface mbed-rtos mbed ConfigFile

Committer:
dwini
Date:
Thu Mar 05 13:18:28 2015 +0000
Revision:
1:8efef658d90b
Child:
2:a8eebf64cd3e
Create TCP Daemon and some logging (most of TRex code).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dwini 1:8efef658d90b 1 #include "TcpDaemon.h"
dwini 1:8efef658d90b 2 #include "Log.h"
dwini 1:8efef658d90b 3
dwini 1:8efef658d90b 4 // Incomming message end
dwini 1:8efef658d90b 5 #define END_MSG_SEQUENCE "\r\n"
dwini 1:8efef658d90b 6
dwini 1:8efef658d90b 7 namespace MachineVision{
dwini 1:8efef658d90b 8 /*
dwini 1:8efef658d90b 9 * TcpDaemon constructor
dwini 1:8efef658d90b 10 *
dwini 1:8efef658d90b 11 * @server_port the port the daemon will be listening on
dwini 1:8efef658d90b 12 */
dwini 1:8efef658d90b 13 TcpDaemon::TcpDaemon(int server_port) {
dwini 1:8efef658d90b 14 this->server_port = server_port;
dwini 1:8efef658d90b 15 this->keepListening = true;
dwini 1:8efef658d90b 16 }
dwini 1:8efef658d90b 17
dwini 1:8efef658d90b 18 /*
dwini 1:8efef658d90b 19 * Make the daemon start listening for incoming connections
dwini 1:8efef658d90b 20 */
dwini 1:8efef658d90b 21 void TcpDaemon::startListening() {
dwini 1:8efef658d90b 22 if (this->bindSocket()) {
dwini 1:8efef658d90b 23 this->doListen();
dwini 1:8efef658d90b 24 }
dwini 1:8efef658d90b 25 }
dwini 1:8efef658d90b 26
dwini 1:8efef658d90b 27 /*
dwini 1:8efef658d90b 28 * Bind to server socket
dwini 1:8efef658d90b 29 *
dwini 1:8efef658d90b 30 * @return true on success
dwini 1:8efef658d90b 31 */
dwini 1:8efef658d90b 32 bool TcpDaemon::bindSocket() {
dwini 1:8efef658d90b 33 if(server.bind(server_port) < 0) {
dwini 1:8efef658d90b 34 Log::e("Bind failed. Error\r\n");
dwini 1:8efef658d90b 35 return false;
dwini 1:8efef658d90b 36 } else {
dwini 1:8efef658d90b 37 Log::d("Bind ok\r\n");
dwini 1:8efef658d90b 38 return true;
dwini 1:8efef658d90b 39 }
dwini 1:8efef658d90b 40 }
dwini 1:8efef658d90b 41
dwini 1:8efef658d90b 42 /*
dwini 1:8efef658d90b 43 * Listen for incoming connections
dwini 1:8efef658d90b 44 */
dwini 1:8efef658d90b 45 void TcpDaemon::doListen() {
dwini 1:8efef658d90b 46
dwini 1:8efef658d90b 47 // Listen for incoming connection
dwini 1:8efef658d90b 48 if (server.listen(MAX_BACKLOG) < 0) {
dwini 1:8efef658d90b 49 Log::w("Listen failed\r\n");
dwini 1:8efef658d90b 50 return;
dwini 1:8efef658d90b 51 }
dwini 1:8efef658d90b 52
dwini 1:8efef658d90b 53 while (this->keepListening) {
dwini 1:8efef658d90b 54 Log::d("Listening for incoming connection ...\r\n");
dwini 1:8efef658d90b 55
dwini 1:8efef658d90b 56 // Accept connection from an incoming client
dwini 1:8efef658d90b 57 if (server.accept(client) < 0) {
dwini 1:8efef658d90b 58 Log::w("Client accept failed\r\n");
dwini 1:8efef658d90b 59 } else {
dwini 1:8efef658d90b 60 Log::d("Client connected: %s\r\n", client.get_address());
dwini 1:8efef658d90b 61
dwini 1:8efef658d90b 62 // Set non-blocking
dwini 1:8efef658d90b 63 client.set_blocking(false, TCP_TIMEOUT);
dwini 1:8efef658d90b 64
dwini 1:8efef658d90b 65 while (client.is_connected()) {
dwini 1:8efef658d90b 66 // Keep receiving messages from the client
dwini 1:8efef658d90b 67 int read_size = 0;
dwini 1:8efef658d90b 68 int total_read_size = 0;
dwini 1:8efef658d90b 69 char * end = NULL;
dwini 1:8efef658d90b 70
dwini 1:8efef658d90b 71 while((read_size = client.receive(buffer, BUFFER_SIZE)) > 0) {
dwini 1:8efef658d90b 72 total_read_size = read_size;
dwini 1:8efef658d90b 73
dwini 1:8efef658d90b 74 // Null-terminate string
dwini 1:8efef658d90b 75 this->buffer[total_read_size] = '\0';
dwini 1:8efef658d90b 76 Log::v("Received partial: %s\r\n", this->buffer);
dwini 1:8efef658d90b 77
dwini 1:8efef658d90b 78 // Keep reading until full message is received
dwini 1:8efef658d90b 79 end = strstr(this->buffer, END_MSG_SEQUENCE); // Find END_MSG_SEQUENCE
dwini 1:8efef658d90b 80 while (total_read_size < BUFFER_SIZE && end == NULL) {
dwini 1:8efef658d90b 81 read_size = client.receive(this->buffer+total_read_size, BUFFER_SIZE-total_read_size);
dwini 1:8efef658d90b 82 if (read_size != -1) {
dwini 1:8efef658d90b 83 total_read_size += read_size;
dwini 1:8efef658d90b 84 end = strstr(this->buffer, END_MSG_SEQUENCE);
dwini 1:8efef658d90b 85 }
dwini 1:8efef658d90b 86 Log::v("Waiting for rest of message\r\n");
dwini 1:8efef658d90b 87 }
dwini 1:8efef658d90b 88 }
dwini 1:8efef658d90b 89
dwini 1:8efef658d90b 90 if (total_read_size > 0) {
dwini 1:8efef658d90b 91 if (end == NULL) {
dwini 1:8efef658d90b 92 Log::w("Buffer full\r\n");
dwini 1:8efef658d90b 93 } else {
dwini 1:8efef658d90b 94 // Null-terminate string
dwini 1:8efef658d90b 95 this->buffer[total_read_size] = '\0';
dwini 1:8efef658d90b 96
dwini 1:8efef658d90b 97 // Full string received, lets do our thing
dwini 1:8efef658d90b 98 Log::v("Received: %s", this->buffer);
dwini 1:8efef658d90b 99 }
dwini 1:8efef658d90b 100 }
dwini 1:8efef658d90b 101 }
dwini 1:8efef658d90b 102
dwini 1:8efef658d90b 103 Log::d("Client disconnected\r\n");
dwini 1:8efef658d90b 104 fflush(stdout);
dwini 1:8efef658d90b 105 client.close();
dwini 1:8efef658d90b 106 }
dwini 1:8efef658d90b 107 }
dwini 1:8efef658d90b 108 }
dwini 1:8efef658d90b 109 }