RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1
kevman 0:38ceb79fef03 2 /** \addtogroup netsocket */
kevman 0:38ceb79fef03 3 /** @{*/
kevman 0:38ceb79fef03 4 /* TCPSocket
kevman 0:38ceb79fef03 5 * Copyright (c) 2015 ARM Limited
kevman 0:38ceb79fef03 6 *
kevman 0:38ceb79fef03 7 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 8 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 9 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 10 *
kevman 0:38ceb79fef03 11 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 12 *
kevman 0:38ceb79fef03 13 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 14 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 16 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 17 * limitations under the License.
kevman 0:38ceb79fef03 18 */
kevman 0:38ceb79fef03 19
kevman 0:38ceb79fef03 20 #ifndef TCPSOCKET_H
kevman 0:38ceb79fef03 21 #define TCPSOCKET_H
kevman 0:38ceb79fef03 22
kevman 0:38ceb79fef03 23 #include "netsocket/InternetSocket.h"
kevman 0:38ceb79fef03 24 #include "netsocket/NetworkStack.h"
kevman 0:38ceb79fef03 25 #include "netsocket/NetworkInterface.h"
kevman 0:38ceb79fef03 26 #include "rtos/EventFlags.h"
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28
kevman 0:38ceb79fef03 29 /** TCP socket connection
kevman 0:38ceb79fef03 30 */
kevman 0:38ceb79fef03 31 class TCPSocket : public InternetSocket {
kevman 0:38ceb79fef03 32 public:
kevman 0:38ceb79fef03 33 /** Create an uninitialized socket
kevman 0:38ceb79fef03 34 *
kevman 0:38ceb79fef03 35 * Must call open to initialize the socket on a network stack.
kevman 0:38ceb79fef03 36 */
kevman 0:38ceb79fef03 37 TCPSocket();
kevman 0:38ceb79fef03 38
kevman 0:38ceb79fef03 39 /** Create a socket on a network interface
kevman 0:38ceb79fef03 40 *
kevman 0:38ceb79fef03 41 * Creates and opens a socket on the network stack of the given
kevman 0:38ceb79fef03 42 * network interface.
kevman 0:38ceb79fef03 43 *
kevman 0:38ceb79fef03 44 * @param stack Network stack as target for socket
kevman 0:38ceb79fef03 45 */
kevman 0:38ceb79fef03 46 template <typename S>
kevman 0:38ceb79fef03 47 TCPSocket(S *stack)
kevman 0:38ceb79fef03 48 {
kevman 0:38ceb79fef03 49 open(stack);
kevman 0:38ceb79fef03 50 }
kevman 0:38ceb79fef03 51
kevman 0:38ceb79fef03 52 /** Destroy a socket
kevman 0:38ceb79fef03 53 *
kevman 0:38ceb79fef03 54 * Closes socket if the socket is still open
kevman 0:38ceb79fef03 55 */
kevman 0:38ceb79fef03 56 virtual ~TCPSocket();
kevman 0:38ceb79fef03 57
kevman 0:38ceb79fef03 58 /** Override multicast functions to return error for TCP
kevman 0:38ceb79fef03 59 *
kevman 0:38ceb79fef03 60 */
kevman 0:38ceb79fef03 61 virtual int join_multicast_group(const SocketAddress &address)
kevman 0:38ceb79fef03 62 {
kevman 0:38ceb79fef03 63 return NSAPI_ERROR_UNSUPPORTED;
kevman 0:38ceb79fef03 64 }
kevman 0:38ceb79fef03 65
kevman 0:38ceb79fef03 66 /** Connects TCP socket to a remote host
kevman 0:38ceb79fef03 67 *
kevman 0:38ceb79fef03 68 * Initiates a connection to a remote server specified by either
kevman 0:38ceb79fef03 69 * a domain name or an IP address and a port.
kevman 0:38ceb79fef03 70 *
kevman 0:38ceb79fef03 71 * @param host Hostname of the remote host
kevman 0:38ceb79fef03 72 * @param port Port of the remote host
kevman 0:38ceb79fef03 73 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 74 */
kevman 0:38ceb79fef03 75 nsapi_error_t connect(const char *host, uint16_t port);
kevman 0:38ceb79fef03 76
kevman 0:38ceb79fef03 77 /** Connects TCP socket to a remote host
kevman 0:38ceb79fef03 78 *
kevman 0:38ceb79fef03 79 * Initiates a connection to a remote server specified by the
kevman 0:38ceb79fef03 80 * indicated address.
kevman 0:38ceb79fef03 81 *
kevman 0:38ceb79fef03 82 * @param address The SocketAddress of the remote host
kevman 0:38ceb79fef03 83 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 84 */
kevman 0:38ceb79fef03 85 virtual nsapi_error_t connect(const SocketAddress &address);
kevman 0:38ceb79fef03 86
kevman 0:38ceb79fef03 87 /** Send data over a TCP socket
kevman 0:38ceb79fef03 88 *
kevman 0:38ceb79fef03 89 * The socket must be connected to a remote host. Returns the number of
kevman 0:38ceb79fef03 90 * bytes sent from the buffer.
kevman 0:38ceb79fef03 91 *
kevman 0:38ceb79fef03 92 * By default, send blocks until all data is sent. If socket is set to
kevman 0:38ceb79fef03 93 * non-blocking or times out, a partial amount can be written.
kevman 0:38ceb79fef03 94 * NSAPI_ERROR_WOULD_BLOCK is returned if no data was written.
kevman 0:38ceb79fef03 95 *
kevman 0:38ceb79fef03 96 * @param data Buffer of data to send to the host
kevman 0:38ceb79fef03 97 * @param size Size of the buffer in bytes
kevman 0:38ceb79fef03 98 * @return Number of sent bytes on success, negative error
kevman 0:38ceb79fef03 99 * code on failure
kevman 0:38ceb79fef03 100 */
kevman 0:38ceb79fef03 101 virtual nsapi_size_or_error_t send(const void *data, nsapi_size_t size);
kevman 0:38ceb79fef03 102
kevman 0:38ceb79fef03 103 /** Receive data over a TCP socket
kevman 0:38ceb79fef03 104 *
kevman 0:38ceb79fef03 105 * The socket must be connected to a remote host. Returns the number of
kevman 0:38ceb79fef03 106 * bytes received into the buffer.
kevman 0:38ceb79fef03 107 *
kevman 0:38ceb79fef03 108 * By default, recv blocks until some data is received. If socket is set to
kevman 0:38ceb79fef03 109 * non-blocking or times out, NSAPI_ERROR_WOULD_BLOCK can be returned to
kevman 0:38ceb79fef03 110 * indicate no data.
kevman 0:38ceb79fef03 111 *
kevman 0:38ceb79fef03 112 * @param data Destination buffer for data received from the host
kevman 0:38ceb79fef03 113 * @param size Size of the buffer in bytes
kevman 0:38ceb79fef03 114 * @return Number of received bytes on success, negative error
kevman 0:38ceb79fef03 115 * code on failure. If no data is available to be received
kevman 0:38ceb79fef03 116 * and the peer has performed an orderly shutdown,
kevman 0:38ceb79fef03 117 * recv() returns 0.
kevman 0:38ceb79fef03 118 */
kevman 0:38ceb79fef03 119 virtual nsapi_size_or_error_t recv(void *data, nsapi_size_t size);
kevman 0:38ceb79fef03 120
kevman 0:38ceb79fef03 121 /** Send data on a socket.
kevman 0:38ceb79fef03 122 *
kevman 0:38ceb79fef03 123 * TCP socket is connection oriented protocol, so address is ignored.
kevman 0:38ceb79fef03 124 *
kevman 0:38ceb79fef03 125 * By default, sendto blocks until data is sent. If socket is set to
kevman 0:38ceb79fef03 126 * non-blocking or times out, NSAPI_ERROR_WOULD_BLOCK is returned
kevman 0:38ceb79fef03 127 * immediately.
kevman 0:38ceb79fef03 128 *
kevman 0:38ceb79fef03 129 * @param address Remote address
kevman 0:38ceb79fef03 130 * @param data Buffer of data to send to the host
kevman 0:38ceb79fef03 131 * @param size Size of the buffer in bytes
kevman 0:38ceb79fef03 132 * @return Number of sent bytes on success, negative error
kevman 0:38ceb79fef03 133 * code on failure
kevman 0:38ceb79fef03 134 */
kevman 0:38ceb79fef03 135 virtual nsapi_size_or_error_t sendto(const SocketAddress &address,
kevman 0:38ceb79fef03 136 const void *data, nsapi_size_t size);
kevman 0:38ceb79fef03 137
kevman 0:38ceb79fef03 138 /** Receive a data from a socket
kevman 0:38ceb79fef03 139 *
kevman 0:38ceb79fef03 140 * Receives a data and stores the source address in address if address
kevman 0:38ceb79fef03 141 * is not NULL. Returns the number of bytes written into the buffer.
kevman 0:38ceb79fef03 142 *
kevman 0:38ceb79fef03 143 * By default, recvfrom blocks until a data is received. If socket is set to
kevman 0:38ceb79fef03 144 * non-blocking or times out with no datagram, NSAPI_ERROR_WOULD_BLOCK
kevman 0:38ceb79fef03 145 * is returned.
kevman 0:38ceb79fef03 146 *
kevman 0:38ceb79fef03 147 * @param address Destination for the source address or NULL
kevman 0:38ceb79fef03 148 * @param data Destination buffer for datagram received from the host
kevman 0:38ceb79fef03 149 * @param size Size of the buffer in bytes
kevman 0:38ceb79fef03 150 * @return Number of received bytes on success, negative error
kevman 0:38ceb79fef03 151 * code on failure
kevman 0:38ceb79fef03 152 */
kevman 0:38ceb79fef03 153 virtual nsapi_size_or_error_t recvfrom(SocketAddress *address,
kevman 0:38ceb79fef03 154 void *data, nsapi_size_t size);
kevman 0:38ceb79fef03 155
kevman 0:38ceb79fef03 156 /** Accepts a connection on a socket.
kevman 0:38ceb79fef03 157 *
kevman 0:38ceb79fef03 158 * The server socket must be bound and set to listen for connections.
kevman 0:38ceb79fef03 159 * On a new connection, returns connected network socket which user is expected to call close()
kevman 0:38ceb79fef03 160 * and that deallocates the resources. Referencing a returned pointer after a close()
kevman 0:38ceb79fef03 161 * call is not allowed and leads to undefined behaviour.
kevman 0:38ceb79fef03 162 *
kevman 0:38ceb79fef03 163 * By default, accept blocks until incomming connection occurs. If socket is set to
kevman 0:38ceb79fef03 164 * non-blocking or times out, error is set to NSAPI_ERROR_WOULD_BLOCK.
kevman 0:38ceb79fef03 165 *
kevman 0:38ceb79fef03 166 * @param error pointer to storage of the error value or NULL
kevman 0:38ceb79fef03 167 * @return pointer to a socket
kevman 0:38ceb79fef03 168 */
kevman 0:38ceb79fef03 169 virtual TCPSocket *accept(nsapi_error_t *error = NULL);
kevman 0:38ceb79fef03 170
kevman 0:38ceb79fef03 171 /** Listen for incoming connections.
kevman 0:38ceb79fef03 172 *
kevman 0:38ceb79fef03 173 * Marks the socket as a passive socket that can be used to accept
kevman 0:38ceb79fef03 174 * incoming connections.
kevman 0:38ceb79fef03 175 *
kevman 0:38ceb79fef03 176 * @param backlog Number of pending connections that can be queued
kevman 0:38ceb79fef03 177 * simultaneously, defaults to 1
kevman 0:38ceb79fef03 178 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 179 */
kevman 0:38ceb79fef03 180 virtual nsapi_error_t listen(int backlog = 1);
kevman 0:38ceb79fef03 181
kevman 0:38ceb79fef03 182 protected:
kevman 0:38ceb79fef03 183 friend class TCPServer;
kevman 0:38ceb79fef03 184 virtual nsapi_protocol_t get_proto();
kevman 0:38ceb79fef03 185
kevman 0:38ceb79fef03 186 private:
kevman 0:38ceb79fef03 187 /** Create a socket out of a given socket
kevman 0:38ceb79fef03 188 *
kevman 0:38ceb79fef03 189 * To be used within accept() function. Close() will clean this up.
kevman 0:38ceb79fef03 190 */
kevman 0:38ceb79fef03 191 TCPSocket(TCPSocket *parent, nsapi_socket_t socket, SocketAddress address);
kevman 0:38ceb79fef03 192 };
kevman 0:38ceb79fef03 193
kevman 0:38ceb79fef03 194
kevman 0:38ceb79fef03 195 #endif
kevman 0:38ceb79fef03 196
kevman 0:38ceb79fef03 197 /** @}*/