Daniele Lacamera / PicoTCP-Experimental_CDC_ECM_Branch

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Tue Jun 11 21:10:23 2013 +0000
Revision:
24:8bff2b51ea3b
Parent:
19:c7debad9a20a
Reworked socket interface. Fixed several bugs.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 5:445d2fc04784 1 /*
tass 5:445d2fc04784 2 *
tass 5:445d2fc04784 3 * PicoTCP Socket interface for mbed.
tass 5:445d2fc04784 4 * Copyright (C) 2013 TASS Belgium NV
tass 5:445d2fc04784 5 *
tass 5:445d2fc04784 6 * Released under GPL v2
tass 5:445d2fc04784 7 *
tass 5:445d2fc04784 8 * Other licensing models might apply at the sole discretion of the copyright holders.
tass 5:445d2fc04784 9 *
tass 5:445d2fc04784 10 *
tass 5:445d2fc04784 11 * This software is based on the mbed.org EthernetInterface implementation:
tass 5:445d2fc04784 12 * Copyright (C) 2012 mbed.org, MIT License
tass 5:445d2fc04784 13 *
tass 5:445d2fc04784 14 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tass 5:445d2fc04784 15 * and associated documentation files (the "Software"), to deal in the Software without restriction,
tass 5:445d2fc04784 16 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
tass 5:445d2fc04784 17 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
tass 5:445d2fc04784 18 * furnished to do so, subject to the following conditions:
tass 5:445d2fc04784 19 *
tass 5:445d2fc04784 20 * The above copyright notice and this permission notice shall be included in all copies or
tass 5:445d2fc04784 21 * substantial portions of the Software.
tass 5:445d2fc04784 22 *
tass 5:445d2fc04784 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
tass 5:445d2fc04784 24 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
tass 5:445d2fc04784 25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
tass 5:445d2fc04784 26 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tass 5:445d2fc04784 27 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tass 5:445d2fc04784 28 */
tass 5:445d2fc04784 29 #include "TCPSocketConnection.h"
tass 18:c6f67fcfc62a 30 #include "wrapper.h"
tass 5:445d2fc04784 31 #include <cstring>
tass 5:445d2fc04784 32
tass 5:445d2fc04784 33 using std::memset;
tass 5:445d2fc04784 34 using std::memcpy;
tass 5:445d2fc04784 35
tass 5:445d2fc04784 36 TCPSocketConnection::TCPSocketConnection() :
tass 5:445d2fc04784 37 _is_connected(false) {
tass 5:445d2fc04784 38 }
tass 5:445d2fc04784 39
tass 5:445d2fc04784 40 int TCPSocketConnection::connect(const char* host, const int port) {
tass 5:445d2fc04784 41 if (init_socket(SOCK_STREAM) < 0)
tass 5:445d2fc04784 42 {
tass 5:445d2fc04784 43 printf("init_socket\n");
tass 5:445d2fc04784 44 return -1;
tass 5:445d2fc04784 45 }
tass 5:445d2fc04784 46
tass 5:445d2fc04784 47 if (set_address(host, port) != 0)
tass 5:445d2fc04784 48 {
tass 5:445d2fc04784 49 printf("set_address\n");
tass 5:445d2fc04784 50 return -1;
tass 5:445d2fc04784 51 }
tass 5:445d2fc04784 52
daniele 19:c7debad9a20a 53 if (picotcp_connect(_ep, (struct sockaddr *) &_remoteHost, sizeof(_remoteHost)) < 0) {
tass 5:445d2fc04784 54 close();
tass 5:445d2fc04784 55 return -1;
tass 5:445d2fc04784 56 }
tass 5:445d2fc04784 57 _is_connected = true;
tass 5:445d2fc04784 58
tass 5:445d2fc04784 59 return 0;
tass 5:445d2fc04784 60 }
tass 5:445d2fc04784 61
tass 5:445d2fc04784 62 bool TCPSocketConnection::is_connected(void) {
tass 5:445d2fc04784 63 return _is_connected;
tass 5:445d2fc04784 64 }
tass 5:445d2fc04784 65
tass 5:445d2fc04784 66 int TCPSocketConnection::send(char* data, int length) {
daniele 24:8bff2b51ea3b 67 int ret;
daniele 19:c7debad9a20a 68 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 69 return -1;
tass 5:445d2fc04784 70
tass 5:445d2fc04784 71 if (!_blocking) {
tass 5:445d2fc04784 72 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 73 if (wait_writable(timeout) != 0)
tass 5:445d2fc04784 74 {
tass 5:445d2fc04784 75 printf("Failed\n");
tass 5:445d2fc04784 76 return -1;
tass 5:445d2fc04784 77 }
tass 5:445d2fc04784 78 }
daniele 24:8bff2b51ea3b 79 ret = picotcp_write(_ep, data, length);
daniele 24:8bff2b51ea3b 80 if (ret < length) {
daniele 24:8bff2b51ea3b 81 _ep->revents &= (~PICO_SOCK_EV_WR);
daniele 24:8bff2b51ea3b 82 printf("Short write\n");
daniele 24:8bff2b51ea3b 83 }
daniele 24:8bff2b51ea3b 84 return ret;
tass 5:445d2fc04784 85 }
tass 5:445d2fc04784 86
tass 5:445d2fc04784 87 // -1 if unsuccessful, else number of bytes written
tass 5:445d2fc04784 88 int TCPSocketConnection::send_all(char* data, int length) {
daniele 24:8bff2b51ea3b 89 int ret;
daniele 19:c7debad9a20a 90 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 91 return -1;
tass 5:445d2fc04784 92
daniele 19:c7debad9a20a 93 if (!_blocking) {
daniele 19:c7debad9a20a 94 TimeInterval timeout(_timeout);
daniele 19:c7debad9a20a 95 // Wait for socket to be writeable
daniele 19:c7debad9a20a 96 if (wait_writable(timeout) != 0) {
daniele 19:c7debad9a20a 97 return 0;
tass 5:445d2fc04784 98 }
tass 5:445d2fc04784 99 }
daniele 24:8bff2b51ea3b 100 ret = picotcp_write(_ep, data, length);
daniele 24:8bff2b51ea3b 101 if (ret < length) {
daniele 24:8bff2b51ea3b 102 _ep->revents &= (~PICO_SOCK_EV_WR);
daniele 24:8bff2b51ea3b 103 //printf("Short write\n");
daniele 24:8bff2b51ea3b 104 }
daniele 24:8bff2b51ea3b 105 return ret;
tass 5:445d2fc04784 106 }
tass 5:445d2fc04784 107
tass 5:445d2fc04784 108 int TCPSocketConnection::receive(char* data, int length) {
daniele 24:8bff2b51ea3b 109 int ret;
daniele 19:c7debad9a20a 110 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 111 return -1;
tass 5:445d2fc04784 112
tass 5:445d2fc04784 113 if (!_blocking) {
tass 5:445d2fc04784 114 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 115 if (wait_readable(timeout) != 0)
tass 13:c6662adea07d 116 {
tass 13:c6662adea07d 117 printf("Failed receiving\n");
tass 5:445d2fc04784 118 return -1;
tass 13:c6662adea07d 119 }
tass 5:445d2fc04784 120 }
daniele 24:8bff2b51ea3b 121 ret = picotcp_read(_ep, data, length);
daniele 24:8bff2b51ea3b 122 if (ret < length) {
daniele 24:8bff2b51ea3b 123 _ep->revents &= (~PICO_SOCK_EV_RD);
daniele 24:8bff2b51ea3b 124 //printf("Short read\n");
daniele 24:8bff2b51ea3b 125 }
daniele 24:8bff2b51ea3b 126 return ret;
tass 5:445d2fc04784 127 }
tass 5:445d2fc04784 128
tass 5:445d2fc04784 129 // -1 if unsuccessful, else number of bytes received
tass 5:445d2fc04784 130 int TCPSocketConnection::receive_all(char* data, int length) {
daniele 19:c7debad9a20a 131 return receive(data, length);
tass 5:445d2fc04784 132 }