The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /* Copyright (C) 2013 mbed.org, MIT License
sinrab 0:5464d5e415e5 2 *
sinrab 0:5464d5e415e5 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sinrab 0:5464d5e415e5 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sinrab 0:5464d5e415e5 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sinrab 0:5464d5e415e5 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sinrab 0:5464d5e415e5 7 * furnished to do so, subject to the following conditions:
sinrab 0:5464d5e415e5 8 *
sinrab 0:5464d5e415e5 9 * The above copyright notice and this permission notice shall be included in all copies or
sinrab 0:5464d5e415e5 10 * substantial portions of the Software.
sinrab 0:5464d5e415e5 11 *
sinrab 0:5464d5e415e5 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sinrab 0:5464d5e415e5 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sinrab 0:5464d5e415e5 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sinrab 0:5464d5e415e5 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sinrab 0:5464d5e415e5 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sinrab 0:5464d5e415e5 17 */
sinrab 0:5464d5e415e5 18
sinrab 0:5464d5e415e5 19 #include "TCPSocketServer.h"
sinrab 0:5464d5e415e5 20 #include <string>
sinrab 0:5464d5e415e5 21
sinrab 0:5464d5e415e5 22 TCPSocketServer::TCPSocketServer() {
sinrab 0:5464d5e415e5 23
sinrab 0:5464d5e415e5 24 }
sinrab 0:5464d5e415e5 25
sinrab 0:5464d5e415e5 26 int TCPSocketServer::bind(int port) {
sinrab 0:5464d5e415e5 27 if (init_socket(SOCK_STREAM, IPPROTO_TCP) < 0) {
sinrab 0:5464d5e415e5 28 return -1;
sinrab 0:5464d5e415e5 29 }
sinrab 0:5464d5e415e5 30
sinrab 0:5464d5e415e5 31 sockaddr_in localHost;
sinrab 0:5464d5e415e5 32 memset(&localHost, 0, sizeof(localHost));
sinrab 0:5464d5e415e5 33
sinrab 0:5464d5e415e5 34 localHost.sin_family = AF_INET;
sinrab 0:5464d5e415e5 35 localHost.sin_port = htons(port);
sinrab 0:5464d5e415e5 36 localHost.sin_addr.s_addr = 0;
sinrab 0:5464d5e415e5 37
sinrab 0:5464d5e415e5 38 if (_cc3000_module->_socket.bind(_sock_fd, (const sockaddr *)&localHost, sizeof(localHost)) < 0) {
sinrab 0:5464d5e415e5 39 close();
sinrab 0:5464d5e415e5 40 return -1;
sinrab 0:5464d5e415e5 41 }
sinrab 0:5464d5e415e5 42
sinrab 0:5464d5e415e5 43 return 0;
sinrab 0:5464d5e415e5 44 }
sinrab 0:5464d5e415e5 45
sinrab 0:5464d5e415e5 46 int TCPSocketServer::listen(int max) {
sinrab 0:5464d5e415e5 47 if (_sock_fd < 0) {
sinrab 0:5464d5e415e5 48 return -1;
sinrab 0:5464d5e415e5 49 }
sinrab 0:5464d5e415e5 50
sinrab 0:5464d5e415e5 51 if (_cc3000_module->_socket.listen(_sock_fd, max) < 0) {
sinrab 0:5464d5e415e5 52 close();
sinrab 0:5464d5e415e5 53 return -1;
sinrab 0:5464d5e415e5 54 }
sinrab 0:5464d5e415e5 55
sinrab 0:5464d5e415e5 56 return 0;
sinrab 0:5464d5e415e5 57 }
sinrab 0:5464d5e415e5 58
sinrab 0:5464d5e415e5 59
sinrab 0:5464d5e415e5 60 int TCPSocketServer::accept(TCPSocketConnection& connection) {
sinrab 0:5464d5e415e5 61 if (_sock_fd < 0) {
sinrab 0:5464d5e415e5 62 return -1;
sinrab 0:5464d5e415e5 63 }
sinrab 0:5464d5e415e5 64
sinrab 0:5464d5e415e5 65 if (!_blocking) {
sinrab 0:5464d5e415e5 66 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 67 if (wait_readable(timeout) != 0) {
sinrab 0:5464d5e415e5 68 return -1;
sinrab 0:5464d5e415e5 69 }
sinrab 0:5464d5e415e5 70 }
sinrab 0:5464d5e415e5 71
sinrab 0:5464d5e415e5 72 connection.reset_address();
sinrab 0:5464d5e415e5 73 socklen_t newSockRemoteHostLen = sizeof(connection._remote_host);
sinrab 0:5464d5e415e5 74 int fd = _cc3000_module->_socket.accept(_sock_fd, (sockaddr *) &connection._remote_host, &newSockRemoteHostLen);
sinrab 0:5464d5e415e5 75 if (fd < 0) {
sinrab 0:5464d5e415e5 76 return -1;
sinrab 0:5464d5e415e5 77 }
sinrab 0:5464d5e415e5 78 /* s_addr is returned in the little endian */
sinrab 0:5464d5e415e5 79 connection._remote_host.sin_addr.s_addr = htonl(connection._remote_host.sin_addr.s_addr);
sinrab 0:5464d5e415e5 80 connection._sock_fd = fd;
sinrab 0:5464d5e415e5 81 connection._is_connected = true;
sinrab 0:5464d5e415e5 82
sinrab 0:5464d5e415e5 83 return 0;
sinrab 0:5464d5e415e5 84 }
sinrab 0:5464d5e415e5 85