Machine Vision Status TCP Server
Dependencies: C12832 EthernetInterface mbed-rtos mbed ConfigFile
TcpDaemon.cpp@1:8efef658d90b, 2015-03-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |