Daniele Lacamera / PicoTCP-Experimental_CDC_ECM_Branch

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Sat Jun 08 13:47:53 2013 +0000
Revision:
19:c7debad9a20a
Parent:
18:c6f67fcfc62a
Child:
24:8bff2b51ea3b
Refactoring of the socket interface

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 19:c7debad9a20a 67 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 68 return -1;
tass 5:445d2fc04784 69
tass 5:445d2fc04784 70 if (!_blocking) {
tass 5:445d2fc04784 71 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 72 if (wait_writable(timeout) != 0)
tass 5:445d2fc04784 73 {
tass 5:445d2fc04784 74 printf("Failed\n");
tass 5:445d2fc04784 75 return -1;
tass 5:445d2fc04784 76 }
tass 5:445d2fc04784 77 }
daniele 19:c7debad9a20a 78 return picotcp_write(_ep, data, length);
tass 5:445d2fc04784 79 }
tass 5:445d2fc04784 80
tass 5:445d2fc04784 81 // -1 if unsuccessful, else number of bytes written
tass 5:445d2fc04784 82 int TCPSocketConnection::send_all(char* data, int length) {
daniele 19:c7debad9a20a 83 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 84 return -1;
tass 5:445d2fc04784 85
daniele 19:c7debad9a20a 86 if (!_blocking) {
daniele 19:c7debad9a20a 87 TimeInterval timeout(_timeout);
daniele 19:c7debad9a20a 88 // Wait for socket to be writeable
daniele 19:c7debad9a20a 89 if (wait_writable(timeout) != 0) {
daniele 19:c7debad9a20a 90 return 0;
tass 5:445d2fc04784 91 }
tass 5:445d2fc04784 92 }
daniele 19:c7debad9a20a 93 return picotcp_write(_ep, data, length);
tass 5:445d2fc04784 94 }
tass 5:445d2fc04784 95
tass 5:445d2fc04784 96 int TCPSocketConnection::receive(char* data, int length) {
daniele 19:c7debad9a20a 97 if ((_ep < 0) || !_is_connected)
tass 5:445d2fc04784 98 return -1;
tass 5:445d2fc04784 99
tass 5:445d2fc04784 100 if (!_blocking) {
tass 5:445d2fc04784 101 TimeInterval timeout(_timeout);
tass 5:445d2fc04784 102 if (wait_readable(timeout) != 0)
tass 13:c6662adea07d 103 {
tass 13:c6662adea07d 104 printf("Failed receiving\n");
tass 5:445d2fc04784 105 return -1;
tass 13:c6662adea07d 106 }
tass 5:445d2fc04784 107 }
daniele 19:c7debad9a20a 108 return picotcp_read(_ep, data, length);
tass 5:445d2fc04784 109 }
tass 5:445d2fc04784 110
tass 5:445d2fc04784 111 // -1 if unsuccessful, else number of bytes received
tass 5:445d2fc04784 112 int TCPSocketConnection::receive_all(char* data, int length) {
daniele 19:c7debad9a20a 113 return receive(data, length);
tass 5:445d2fc04784 114 }