zhang chenhong / Mbed 2 deprecated IDW01M1_Cloud_IBM

Dependencies:   mbed Servo X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI NDefLib MQTT

Committer:
mridup
Date:
Fri Apr 08 12:07:17 2016 +0000
Revision:
0:cbf8bc43bc9e
changes for optimization in Keil compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:cbf8bc43bc9e 1 /* Socket
mridup 0:cbf8bc43bc9e 2 * Copyright (c) 2015 ARM Limited
mridup 0:cbf8bc43bc9e 3 *
mridup 0:cbf8bc43bc9e 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:cbf8bc43bc9e 5 * you may not use this file except in compliance with the License.
mridup 0:cbf8bc43bc9e 6 * You may obtain a copy of the License at
mridup 0:cbf8bc43bc9e 7 *
mridup 0:cbf8bc43bc9e 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:cbf8bc43bc9e 9 *
mridup 0:cbf8bc43bc9e 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:cbf8bc43bc9e 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:cbf8bc43bc9e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:cbf8bc43bc9e 13 * See the License for the specific language governing permissions and
mridup 0:cbf8bc43bc9e 14 * limitations under the License.
mridup 0:cbf8bc43bc9e 15 */
mridup 0:cbf8bc43bc9e 16
mridup 0:cbf8bc43bc9e 17 #include "Socket.h"
mridup 0:cbf8bc43bc9e 18 #include <string.h>
mridup 0:cbf8bc43bc9e 19
mridup 0:cbf8bc43bc9e 20 Socket::Socket(NetworkInterface *iface, ns_protocol_t proto)
mridup 0:cbf8bc43bc9e 21 : _iface(iface)
mridup 0:cbf8bc43bc9e 22 , _proto(proto)
mridup 0:cbf8bc43bc9e 23 , _socket(0)
mridup 0:cbf8bc43bc9e 24 {
mridup 0:cbf8bc43bc9e 25 memset(_ip_address, 0, NS_IP_SIZE);
mridup 0:cbf8bc43bc9e 26 _port = 0;
mridup 0:cbf8bc43bc9e 27 }
mridup 0:cbf8bc43bc9e 28
mridup 0:cbf8bc43bc9e 29 Socket::~Socket()
mridup 0:cbf8bc43bc9e 30 {
mridup 0:cbf8bc43bc9e 31 if (_socket) {
mridup 0:cbf8bc43bc9e 32 close();
mridup 0:cbf8bc43bc9e 33 }
mridup 0:cbf8bc43bc9e 34 }
mridup 0:cbf8bc43bc9e 35
mridup 0:cbf8bc43bc9e 36
mridup 0:cbf8bc43bc9e 37 int32_t Socket::open(const char *address, uint16_t port)
mridup 0:cbf8bc43bc9e 38 {
mridup 0:cbf8bc43bc9e 39 int32_t err;
mridup 0:cbf8bc43bc9e 40
mridup 0:cbf8bc43bc9e 41 err = close();
mridup 0:cbf8bc43bc9e 42 if (err) {
mridup 0:cbf8bc43bc9e 43 return err;
mridup 0:cbf8bc43bc9e 44 }
mridup 0:cbf8bc43bc9e 45
mridup 0:cbf8bc43bc9e 46 err = _iface->getHostByName(address, _ip_address);
mridup 0:cbf8bc43bc9e 47 _port = port;
mridup 0:cbf8bc43bc9e 48 if (err) {
mridup 0:cbf8bc43bc9e 49 return err;
mridup 0:cbf8bc43bc9e 50 }
mridup 0:cbf8bc43bc9e 51
mridup 0:cbf8bc43bc9e 52 _socket = _iface->createSocket(_proto);
mridup 0:cbf8bc43bc9e 53 if (!_socket) {
mridup 0:cbf8bc43bc9e 54 return NS_ERROR_NO_SOCKET;
mridup 0:cbf8bc43bc9e 55 }
mridup 0:cbf8bc43bc9e 56
mridup 0:cbf8bc43bc9e 57 err = _socket->open(_ip_address, _port);
mridup 0:cbf8bc43bc9e 58
mridup 0:cbf8bc43bc9e 59 if (err) {
mridup 0:cbf8bc43bc9e 60 _iface->destroySocket(_socket);
mridup 0:cbf8bc43bc9e 61 _socket = 0;
mridup 0:cbf8bc43bc9e 62 }
mridup 0:cbf8bc43bc9e 63
mridup 0:cbf8bc43bc9e 64 return err;
mridup 0:cbf8bc43bc9e 65 }
mridup 0:cbf8bc43bc9e 66
mridup 0:cbf8bc43bc9e 67 int32_t Socket::close()
mridup 0:cbf8bc43bc9e 68 {
mridup 0:cbf8bc43bc9e 69 if (!_socket) {
mridup 0:cbf8bc43bc9e 70 return 0;
mridup 0:cbf8bc43bc9e 71 }
mridup 0:cbf8bc43bc9e 72
mridup 0:cbf8bc43bc9e 73 int32_t err = _socket->close();
mridup 0:cbf8bc43bc9e 74
mridup 0:cbf8bc43bc9e 75 if (!err) {
mridup 0:cbf8bc43bc9e 76 _iface->destroySocket(_socket);
mridup 0:cbf8bc43bc9e 77 _socket = 0;
mridup 0:cbf8bc43bc9e 78 }
mridup 0:cbf8bc43bc9e 79
mridup 0:cbf8bc43bc9e 80 return err;
mridup 0:cbf8bc43bc9e 81 }
mridup 0:cbf8bc43bc9e 82
mridup 0:cbf8bc43bc9e 83 int32_t Socket::send(const void *data, uint32_t size)
mridup 0:cbf8bc43bc9e 84 {
mridup 0:cbf8bc43bc9e 85 if (!_socket) {
mridup 0:cbf8bc43bc9e 86 return NS_ERROR_NO_CONNECTION;
mridup 0:cbf8bc43bc9e 87 }
mridup 0:cbf8bc43bc9e 88 return _socket->send(data, size);
mridup 0:cbf8bc43bc9e 89 }
mridup 0:cbf8bc43bc9e 90
mridup 0:cbf8bc43bc9e 91 int32_t Socket::recv(void *data, uint32_t size, bool blocking)
mridup 0:cbf8bc43bc9e 92 {
mridup 0:cbf8bc43bc9e 93 if (!_socket) {
mridup 0:cbf8bc43bc9e 94 return NS_ERROR_NO_CONNECTION;
mridup 0:cbf8bc43bc9e 95 }
mridup 0:cbf8bc43bc9e 96
mridup 0:cbf8bc43bc9e 97 while (true) {
mridup 0:cbf8bc43bc9e 98 int32_t recv = _socket->recv(data, size);
mridup 0:cbf8bc43bc9e 99
mridup 0:cbf8bc43bc9e 100 if (recv != 0 || !blocking) {
mridup 0:cbf8bc43bc9e 101 return recv;
mridup 0:cbf8bc43bc9e 102 }
mridup 0:cbf8bc43bc9e 103 }
mridup 0:cbf8bc43bc9e 104 }
mridup 0:cbf8bc43bc9e 105
mridup 0:cbf8bc43bc9e 106
mridup 0:cbf8bc43bc9e 107 const char *Socket::getIPAddress() const
mridup 0:cbf8bc43bc9e 108 {
mridup 0:cbf8bc43bc9e 109 if (_ip_address[0]) {
mridup 0:cbf8bc43bc9e 110 return _ip_address;
mridup 0:cbf8bc43bc9e 111 } else {
mridup 0:cbf8bc43bc9e 112 return 0;
mridup 0:cbf8bc43bc9e 113 }
mridup 0:cbf8bc43bc9e 114 }
mridup 0:cbf8bc43bc9e 115
mridup 0:cbf8bc43bc9e 116 uint16_t Socket::getPort() const
mridup 0:cbf8bc43bc9e 117 {
mridup 0:cbf8bc43bc9e 118 return _port;
mridup 0:cbf8bc43bc9e 119 }
mridup 0:cbf8bc43bc9e 120
mridup 0:cbf8bc43bc9e 121 bool Socket::isConnected()
mridup 0:cbf8bc43bc9e 122 {
mridup 0:cbf8bc43bc9e 123 if (!_socket) {
mridup 0:cbf8bc43bc9e 124 return false;
mridup 0:cbf8bc43bc9e 125 }
mridup 0:cbf8bc43bc9e 126
mridup 0:cbf8bc43bc9e 127 return _socket->isConnected();
mridup 0:cbf8bc43bc9e 128 }
mridup 0:cbf8bc43bc9e 129