Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
fnet_socket.h
00001 /************************************************************************** 00002 * 00003 * Copyright 2011-2016 by Andrey Butok. FNET Community. 00004 * Copyright 2008-2010 by Andrey Butok. Freescale Semiconductor, Inc. 00005 * Copyright 2003 by Andrey Butok. Motorola SPS. 00006 * 00007 *************************************************************************** 00008 * 00009 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00010 * not use this file except in compliance with the License. 00011 * You may obtain a copy of the License at 00012 * 00013 * http://www.apache.org/licenses/LICENSE-2.0 00014 * 00015 * Unless required by applicable law or agreed to in writing, software 00016 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00017 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00018 * See the License for the specific language governing permissions and 00019 * limitations under the License. 00020 * 00021 **********************************************************************/ 00022 /*! 00023 * @brief Socket API. 00024 * 00025 ***************************************************************************/ 00026 00027 #ifndef _FNET_SOCKET_H_ 00028 00029 #define _FNET_SOCKET_H_ 00030 00031 #include "fnet_ip.h" 00032 #include "fnet_ip6.h" 00033 00034 /*! @addtogroup fnet_socket 00035 * The Socket Application Program Interface (API) defines the way, in which the 00036 * application program interacts with the TCP/IP stack. It has the 00037 * BSD-like, non-blocking socket interface that makes porting of existing network applications 00038 * to the FNET more convenient.@n 00039 * @n 00040 * The following table summarizes the supported socket API functions: 00041 * <table> 00042 * <caption>Socket functions</caption> 00043 * <tr class="fnet_td_grey"> 00044 * <th ALIGN=CENTER>Category</th><th ALIGN=CENTER>FNET Routine</th><th ALIGN=CENTER>BSD Routine</th><th ALIGN=CENTER>Meaning</th><th ALIGN=CENTER>Server</th> 00045 * <th ALIGN=CENTER>Client</th><th ALIGN=CENTER>@ref SOCK_STREAM</th> <th ALIGN=CENTER>@ref SOCK_DGRAM</th> 00046 * </tr> 00047 * <tr> 00048 * <td>setup</td><td>@ref fnet_socket()</td><td>socket()</td><td>Creates a new unnamed socket within 00049 * a specified communication domain family.</td><td>X</td><td>X</td><td>X</td> 00050 * <td>X</td> 00051 * </tr> 00052 * <tr> 00053 * <td>setup</td><td>@ref fnet_socket_bind()</td><td>bind()</td><td>Assigns a local address to 00054 * a socket.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00055 * </tr> 00056 * <tr> 00057 * <td>server</td><td>@ref fnet_socket_listen()</td><td>listen()</td><td> Prepares a socket to accept 00058 * the incoming connections.</td><td>X</td><td>@n</td><td>X</td><td>@n</td> 00059 * </tr> 00060 * <tr> 00061 * <td>server</td><td>@ref fnet_socket_accept()</td><td>accept()</td><td>Accepts the connections.</td> 00062 * <td>X</td><td>@n</td><td>X</td><td>@n</td> 00063 * </tr> 00064 * <tr> 00065 * <td>client</td><td>@ref fnet_socket_connect()</td><td>connect()</td><td> Establishes a connection to 00066 * a foreign socket.</td><td>@n</td><td>X</td><td>X</td><td>X</td> 00067 * </tr> 00068 * <tr> 00069 * <td>input</td><td>@ref fnet_socket_recv()</td><td>recv()</td><td>Receives the data.</td><td>X</td> 00070 * <td>X</td><td>X</td><td>X</td> 00071 * </tr> 00072 * <tr> 00073 * <td>input</td><td>@ref fnet_socket_recvfrom()</td><td>recvfrom()</td><td>Receives the data and address of 00074 * the sender.</td><td>X</td><td>X</td><td>@n</td><td>X</td> 00075 * </tr> 00076 * <tr> 00077 * <td>output</td><td>@ref fnet_socket_send()</td><td>send()</td><td>Sends the data.</td><td>X</td> 00078 * <td>X</td><td>X</td><td>X</td> 00079 * </tr> 00080 * <tr> 00081 * <td>output</td><td>@ref fnet_socket_sendto()</td><td>sendto()</td><td>Sends the data to a specified 00082 * address.</td><td>X</td><td>X</td><td>@n</td><td>X</td> 00083 * </tr> 00084 * <tr> 00085 * <td>termination</td><td>@ref fnet_socket_shutdown()</td><td>shutdown()</td><td>Terminates a connection 00086 * in one or both directions.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00087 * </tr> 00088 * <tr> 00089 * <td>termination</td><td>@ref fnet_socket_close()</td><td>closesocket()</td><td>Terminates a connection 00090 * and releases the socket.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00091 * </tr> 00092 * <tr> 00093 * <td>administration</td><td>@ref fnet_socket_setopt()</td><td>fnet_socket_setopt()</td><td>Sets socket or protocol 00094 * options.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00095 * </tr> 00096 * <tr> 00097 * <td>administration</td><td>@ref fnet_socket_getopt()</td><td>getsockopt()</td><td>Gets socket or protocol 00098 * options.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00099 * </tr> 00100 * <tr> 00101 * <td>administration</td><td>@ref fnet_socket_getname()</td><td>getsockname()</td><td>Gets a local address 00102 * assigned to a socket.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00103 * </tr> 00104 * <tr> 00105 * <td>administration</td><td>@ref fnet_socket_getpeername()</td><td>getpeername()</td><td>Gets a foreign address 00106 * assigned to a socket.</td><td>X</td><td>X</td><td>X</td><td>X</td> 00107 * </tr> 00108 * </table> 00109 * Configuration parameters: 00110 * - @ref FNET_CFG_SOCKET_MAX 00111 * - @ref FNET_CFG_SOCKET_TCP_TX_BUF_SIZE 00112 * - @ref FNET_CFG_SOCKET_TCP_RX_BUF_SIZE 00113 * - @ref FNET_CFG_SOCKET_UDP_TX_BUF_SIZE 00114 * - @ref FNET_CFG_SOCKET_UDP_RX_BUF_SIZE 00115 * - @ref FNET_CFG_SOCKET_TCP_MSS 00116 * - @ref FNET_CFG_RAW 00117 * - @ref FNET_CFG_SOCKET_BSD_NAMES 00118 * - @ref FNET_CFG_SOCKET_CALLBACK_ON_RX 00119 */ 00120 /*! @{ */ 00121 00122 /* Special addresses */ 00123 00124 /**************************************************************************/ /*! 00125 * @brief It means to use any network interface. 00126 ******************************************************************************/ 00127 #define INADDR_ANY (fnet_ip4_addr_t)(0x00000000U) 00128 00129 /**************************************************************************/ /*! 00130 * @brief Broadcast address. @n 00131 * It can be used to send the broadcast UDP datagrams over an IP network. 00132 ******************************************************************************/ 00133 #define INADDR_BROADCAST (fnet_ip4_addr_t)(0xffffffffU) 00134 00135 /**************************************************************************/ /*! 00136 * @brief Address family type. 00137 * @see AF_UNSPEC, AF_INET, AF_INET6, AF_SUPPORTED 00138 ******************************************************************************/ 00139 typedef fnet_uint16_t fnet_address_family_t; 00140 00141 /**************************************************************************/ /*! 00142 * @brief cope zone index type, defining network interface. 00143 ******************************************************************************/ 00144 typedef fnet_uint32_t fnet_scope_id_t; 00145 00146 /**************************************************************************/ /*! 00147 * @brief Unspecified address family. 00148 ******************************************************************************/ 00149 #define AF_UNSPEC (0U) 00150 /**************************************************************************/ /*! 00151 * @brief IPv4 address family. 00152 ******************************************************************************/ 00153 #define AF_INET (1U) 00154 /**************************************************************************/ /*! 00155 * @brief IPv6 address family. 00156 ******************************************************************************/ 00157 #define AF_INET6 (2U) 00158 /**************************************************************************/ /*! 00159 * @brief Bitmask of supported address families. 00160 * @showinitializer 00161 ******************************************************************************/ 00162 #define AF_SUPPORTED ((fnet_address_family_t)((fnet_address_family_t)(AF_INET6*(fnet_address_family_t)FNET_CFG_IP6) | (fnet_address_family_t)(AF_INET*(fnet_address_family_t)FNET_CFG_IP4))) 00163 00164 /**************************************************************************/ /*! 00165 * @brief Size of sa_data[] field of @ref sockaddr structure. @n 00166 * It used to cover sockaddr_in and sockaddr_in6. 00167 * @showinitializer 00168 ******************************************************************************/ 00169 #if FNET_CFG_IP6 00170 #define FNET_SA_DATA_SIZE (sizeof(struct in6_addr)) 00171 #else /* IPv4 */ 00172 #define FNET_SA_DATA_SIZE (sizeof(struct in_addr)) 00173 #endif 00174 00175 /**************************************************************************/ /*! 00176 * @def FNET_IP_ADDR_STR_SIZE 00177 * @brief Size of the string buffer that will contain 00178 * null-terminated ASCII string of an IP address. It depends on 00179 * if disabled or enabled IPv6. 00180 * @see fnet_inet_ntoa, fnet_inet_ntop 00181 * @showinitializer 00182 ******************************************************************************/ 00183 #if FNET_CFG_IP6 00184 #define FNET_IP_ADDR_STR_SIZE FNET_IP6_ADDR_STR_SIZE 00185 #else /* IPv4 */ 00186 #define FNET_IP_ADDR_STR_SIZE FNET_IP4_ADDR_STR_SIZE 00187 #endif 00188 00189 #define FNET_IP_ADDR_STR_SIZE_MAX FNET_IP6_ADDR_STR_SIZE 00190 00191 /**************************************************************************/ /*! 00192 * @brief IPv4 address structure. 00193 * 00194 * @see sockaddr_in 00195 * 00196 * Actually, it represents an IPv4 address (in network endian). 00197 ******************************************************************************/ 00198 struct in_addr 00199 { 00200 fnet_ip4_addr_t s_addr; /**< @brief 32-bit IPv4 address (in network byte order). 00201 */ 00202 }; 00203 00204 /**************************************************************************/ /*! 00205 * @brief IPv4 Socket address structure. 00206 * 00207 * @see sockaddr 00208 * 00209 * To make manipulation of the @ref sockaddr structure easier, the TCP/IPv4 stack 00210 * also defines the equivalent structure @ref sockaddr_in 00211 * ("in" means "Internet"). 00212 ******************************************************************************/ 00213 struct sockaddr_in 00214 { 00215 fnet_address_family_t sin_family; /**< @brief Specifies the address family. @n 00216 * It must ne set to @ref AF_INET.*/ 00217 fnet_uint16_t sin_port; /**< @brief 16-bit port number used to 00218 * demultiplex the transport-level messages 00219 * (in network byte order).*/ 00220 fnet_scope_id_t sin_scope_id; /**< @brief Scope zone index, defining network interface.*/ 00221 struct in_addr sin_addr; /**< @brief 32-bit internet address.*/ 00222 }; 00223 00224 00225 /************************************************************************ 00226 * IPv6 00227 *************************************************************************/ 00228 00229 00230 /**************************************************************************/ /*! 00231 * @brief IPv6 address structure. 00232 * 00233 * @see sockaddr_in6 00234 * 00235 * Actually, it represents an IPv6 address. 00236 ******************************************************************************/ 00237 struct in6_addr 00238 { 00239 fnet_ip6_addr_t s6_addr; /**< @brief 128-bit IPv6 address.*/ 00240 }; 00241 00242 /**************************************************************************/ /*! 00243 * @brief IPv6 Socket address structure. 00244 * 00245 * @see sockaddr 00246 * 00247 * To make manipulation of the @ref sockaddr structure easier, the TCP/IPv6 stack 00248 * also defines the equivalent structure @ref sockaddr_in6 00249 * ("in" means "Internet"). 00250 ******************************************************************************/ 00251 struct sockaddr_in6 00252 { 00253 fnet_address_family_t sin6_family; /**< @brief Specifies the address family. @n 00254 * It must ne set to @ref AF_INET6. */ 00255 fnet_uint16_t sin6_port; /**< @brief 16-bit port number used to 00256 * demultiplex the transport-level messages 00257 * (in network byte order).*/ 00258 fnet_scope_id_t sin6_scope_id; /**< @brief Scope zone index, defining network interface.*/ 00259 struct in6_addr sin6_addr; /**< @brief 128-bit IPv6 internet address.*/ 00260 }; 00261 00262 /**************************************************************************/ /*! 00263 * @brief Socket address structure. 00264 * 00265 * @see sockaddr_in, sockaddr_in6 00266 * 00267 * The original goal of the @ref sockaddr structure is to support multiple 00268 * protocols. For the TCP/IP stack @c sa_data, it contains a destination address 00269 * and port number for a socket. 00270 ******************************************************************************/ 00271 struct sockaddr 00272 { 00273 fnet_address_family_t sa_family; /**< @brief Address family. Specifies the 00274 * address family, to which the address belongs. @n 00275 * It is defined by @ref fnet_address_family_t.*/ 00276 fnet_uint16_t sa_port; /**< @brief 16-bit port number used to 00277 * demultiplex the transport-level messages 00278 * (in network byte order).*/ 00279 fnet_scope_id_t sa_scope_id; /**< @brief Scope zone index, defining network interface.*/ 00280 fnet_uint8_t sa_data[FNET_SA_DATA_SIZE];/**< @brief Address value. For the TCP/IP stack, 00281 * it contains the destination address and port 00282 * number for a socket.*/ 00283 }; 00284 00285 /**************************************************************************/ /*! 00286 * @brief IPv4 multicast group information. 00287 * 00288 * The structure is used with the @ref IP_ADD_MEMBERSHIP and 00289 * @ref IP_DROP_MEMBERSHIP socket options. 00290 * 00291 * @see IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP 00292 * 00293 ******************************************************************************/ 00294 struct ip_mreq 00295 { 00296 struct in_addr imr_multiaddr; /**< @brief IPv4 multicast address of group. */ 00297 fnet_scope_id_t imr_interface; /**< @brief Interface index. It equals to the scope zone index, defining network interface.@n 00298 * If this member is zero, the default interface is used. */ 00299 }; 00300 00301 /**************************************************************************/ /*! 00302 * @brief IPv6 multicast group information. 00303 * 00304 * The structure is used with the @ref IPV6_JOIN_GROUP and 00305 * @ref IPV6_LEAVE_GROUP socket options. 00306 * 00307 * @see IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP 00308 * 00309 ******************************************************************************/ 00310 struct ipv6_mreq 00311 { 00312 struct in6_addr ipv6imr_multiaddr; /**< @brief IPv6 multicast address of group. */ 00313 fnet_scope_id_t ipv6imr_interface; /**< @brief Interface index. It equals to the scope zone index, defining network interface.@n 00314 * If this member is zero, the default interface is used. */ 00315 }; 00316 00317 /**************************************************************************/ /*! 00318 * @brief Socket types. 00319 ******************************************************************************/ 00320 typedef enum 00321 { 00322 SOCK_UNSPEC = (0U), /**< @brief Unspecified socket type. 00323 */ 00324 SOCK_STREAM = (1U), /**< @brief Stream socket.@n 00325 * Provides reliable, two-way, connection-based 00326 * byte stream. It corresponds to the TCP protocol 00327 */ 00328 SOCK_DGRAM = (2U), /**< @brief Datagram socket.@n 00329 * Provides unreliable, connectionless datagrams. 00330 * It corresponds to the UDP protocol. 00331 */ 00332 SOCK_RAW = (3U) /**< @brief Raw socket.@n 00333 * Raw sockets allow an application to have direct access to 00334 * lower-level communication protocols. 00335 * Raw sockets are intended to take advantage of some protocol feature 00336 * that is not directly accessible through a normal interface, 00337 * or to build new protocols on top of existing low-level protocols.@n 00338 * It can be enabled by the @ref FNET_CFG_RAW option. 00339 */ 00340 } fnet_socket_type_t; 00341 00342 /**************************************************************************/ /*! 00343 * @brief Socket state. 00344 ******************************************************************************/ 00345 typedef enum 00346 { 00347 SS_UNCONNECTED = (0), /**< @brief Not connected to any socket. 00348 */ 00349 SS_CONNECTING = (1), /**< @brief In process of connecting. 00350 */ 00351 SS_CONNECTED = (2), /**< @brief Connected to a socket. 00352 */ 00353 SS_LISTENING = (3) /**< @brief In listening state. 00354 */ 00355 } fnet_socket_state_t; 00356 00357 /**************************************************************************/ /*! 00358 * @brief Protocol numbers and Level numbers for the @ref fnet_socket_setopt() 00359 * and the @ref fnet_socket_getopt(). 00360 ******************************************************************************/ 00361 typedef enum 00362 { 00363 IPPROTO_IP = (0), /**< @brief IPv4 options level number 00364 * for @ref fnet_socket_getopt() and @ref fnet_socket_setopt(). 00365 */ 00366 IPPROTO_ICMP = (1), /**< @brief ICMPv4 protocol number. 00367 */ 00368 IPPROTO_IGMP = (2), /**< @brief IGMP protocol number. 00369 */ 00370 IPPROTO_TCP = (6), /**< @brief TCP protocol number; TCP options level number 00371 * for @ref fnet_socket_getopt() and @ref fnet_socket_setopt(). 00372 */ 00373 IPPROTO_UDP = (17),/**< @brief UDP protocol number. 00374 */ 00375 IPPROTO_IPV6 = (41), /**< @brief IPv6 options level number 00376 * for @ref fnet_socket_getopt() and @ref fnet_socket_setopt(). 00377 */ 00378 IPPROTO_ICMPV6 = (58),/**< @brief ICMPv6 protocol number. 00379 */ 00380 SOL_SOCKET = (255255) /**< @brief Socket options level number for 00381 * @ref fnet_socket_getopt() and @ref fnet_socket_setopt(). 00382 */ 00383 } fnet_protocol_t; 00384 00385 /**************************************************************************/ /*! 00386 * @brief Socket options for the @ref fnet_socket_setopt() and the @ref fnet_socket_getopt(). 00387 * 00388 * <table> 00389 *<caption>Socket SOL_SOCKET, IPPROTO_TCP, IPPROTO_IP and IPPROTO_IPV6 level options</caption> 00390 *<tr class="fnet_td_grey"> 00391 *<th ALIGN=CENTER>Option</th><th ALIGN=CENTER>Option Type</th><th ALIGN=CENTER> 00392 * Default Value</th><th ALIGN=CENTER>Read/Write</th> 00393 *</tr> 00394 *<tr> 00395 *<td>@ref SO_ACCEPTCONN</td><td>fnet_uint32_t</td><td>0</td><td>R</td> 00396 *</tr> 00397 *<tr> 00398 *<td>@ref SO_KEEPALIVE</td><td>fnet_uint32_t</td><td>1</td><td>RW</td> 00399 *</tr> 00400 *<tr> 00401 *<td>@ref SO_DONTROUTE</td><td>fnet_uint32_t</td><td>0</td><td>RW</td> 00402 *</tr> 00403 *<tr> 00404 *<td>@ref SO_LINGER</td><td>struct @ref linger</td><td>{0,0}</td><td>RW</td> 00405 *</tr> 00406 *<tr> 00407 *<td>@ref SO_OOBINLINE</td><td>fnet_uint32_t</td><td>0</td><td>RW</td> 00408 *</tr> 00409 *<tr> 00410 *<td>@ref SO_SNDBUF</td><td>fnet_uint32_t</td> 00411 *<td>@ref FNET_CFG_SOCKET_UDP_TX_BUF_SIZE for UDP @n @ref FNET_CFG_SOCKET_TCP_TX_BUF_SIZE for TCP</td><td>RW</td> 00412 *</tr> 00413 *<tr> 00414 *<td>@ref SO_RCVBUF</td><td>fnet_uint32_t</td> 00415 *<td>@ref FNET_CFG_SOCKET_UDP_RX_BUF_SIZE for UDP @n @ref FNET_CFG_SOCKET_TCP_RX_BUF_SIZE for TCP</td><td>RW</td> 00416 *</tr> 00417 *<tr> 00418 *<td>@ref SO_STATE</td><td>@ref fnet_socket_state_t</td><td>@ref SS_UNCONNECTED</td><td>R</td> 00419 *</tr> 00420 *<tr> 00421 *<td>@ref SO_ERROR</td><td>@ref fnet_error_t</td><td>@ref FNET_ERR_OK</td><td>R</td> 00422 *</tr> 00423 *<tr> 00424 *<td>@ref SO_TYPE</td><td>@ref fnet_socket_type_t</td><td>@ref SOCK_DGRAM for 00425 * UDP @n @ref SOCK_STREAM for TCP</td><td>R</td> 00426 *</tr> 00427 *<tr> 00428 *<td>@ref SO_RCVNUM</td><td>fnet_uint32_t</td><td>0</td><td>R</td> 00429 *</tr> 00430 *<tr> 00431 *<td>@ref SO_SNDNUM</td><td>fnet_uint32_t</td><td>0</td><td>R</td> 00432 *</tr> 00433 *<tr> 00434 *<td>@ref TCP_MSS</td><td>fnet_uint32_t</td><td>536</td><td>RW</td> 00435 *</tr> 00436 *<tr> 00437 *<td>@ref TCP_BSD</td><td>fnet_uint32_t</td><td>1</td><td>RW</td> 00438 *</tr> 00439 *<tr> 00440 *<td>@ref TCP_NODELAY</td><td>fnet_uint32_t</td><td>1</td><td>RW</td> 00441 *</tr> 00442 *<tr> 00443 *<td>@ref TCP_FINRCVD</td><td>fnet_uint32_t</td><td>0</td><td>R</td> 00444 *</tr> 00445 *<tr> 00446 *<td>@ref TCP_URGRCVD</td><td>fnet_uint32_t</td><td>0</td><td>R</td> 00447 *</tr> 00448 *<tr> 00449 *<td>@ref TCP_KEEPIDLE</td><td>fnet_uint32_t</td><td>7200</td><td>RW</td> 00450 *</tr> 00451 *<tr> 00452 *<td>@ref TCP_KEEPINTVL</td><td>fnet_uint32_t</td><td>75</td><td>RW</td> 00453 *</tr> 00454 *<tr> 00455 *<td>@ref TCP_KEEPCNT</td><td>fnet_uint32_t</td><td>8</td><td>RW</td> 00456 *</tr> 00457 *<tr> 00458 *<td>@ref IP_TOS</td><td>fnet_uint32_t</td><td>0</td><td>RW</td> 00459 *</tr> 00460 *<tr> 00461 *<td>@ref IP_TTL</td><td>fnet_uint32_t</td><td>64</td><td>RW</td> 00462 *</tr> 00463 *<tr> 00464 *<td>@ref IP_MULTICAST_TTL</td><td>fnet_uint32_t</td><td>1</td><td>RW</td> 00465 *</tr> 00466 *<tr> 00467 *<td>@ref IP_ADD_MEMBERSHIP</td><td>@ref ip_mreq</td><td>N/A</td><td>W</td> 00468 *</tr> 00469 *<tr> 00470 *<td>@ref IP_DROP_MEMBERSHIP</td><td>@ref ip_mreq</td><td>N/A</td><td>W</td> 00471 *</tr> 00472 *<tr> 00473 *<td>@ref IPV6_UNICAST_HOPS</td><td>fnet_uint32_t</td><td>0 (64)</td><td>RW</td> 00474 *</tr> 00475 *<tr> 00476 *<td>@ref IPV6_MULTICAST_HOPS</td><td>fnet_uint32_t</td><td>1</td><td>RW</td> 00477 *</tr> 00478 *<tr> 00479 *<td>@ref IPV6_JOIN_GROUP</td><td>@ref ipv6_mreq</td><td>N/A</td><td>W</td> 00480 *</tr> 00481 *<tr> 00482 *<td>@ref IPV6_LEAVE_GROUP</td><td>@ref ipv6_mreq</td><td>N/A</td><td>W</td> 00483 *</tr> 00484 *</table> 00485 ******************************************************************************/ 00486 typedef enum 00487 { 00488 SO_ACCEPTCONN, /**< @brief Returns @c 1 if a socket is in 00489 * listening mode and returns @c 0 when vice versa. 00490 * This is the read-only option and it is 00491 * valid only for connection-oriented protocols (TCP). 00492 */ 00493 SO_KEEPALIVE, /**< @brief This option enables keep-alive probes 00494 * for a socket connection. These probes are used 00495 * to maintain a TCP connection and regularly 00496 * test the connection to ensure that it's 00497 * still available. It is only valid for 00498 * connection-oriented protocols (TCP). 00499 */ 00500 SO_DONTROUTE, /**< @brief This option enables bypassing of a routing algorithm. 00501 * It means that the network interface tries to send a datagram without 00502 * a gateway. 00503 */ 00504 SO_LINGER, /**< @brief This option controls the action 00505 * taken when unsent data is present, and 00506 * @ref fnet_socket_close() is called. This option 00507 * is defined by the @ref linger structure. 00508 */ 00509 SO_OOBINLINE, /**< @brief This option specifies that out-of-band (OOB) 00510 * data will be received in line with regular data. 00511 * It is valid only for the TCP protocol. @n 00512 * This option is avalable only if 00513 * @ref FNET_CFG_TCP_URGENT is set to @c 1. 00514 */ 00515 SO_SNDBUF, /**< @brief This option defines the maximum per-socket 00516 * buffer size for output data. 00517 */ 00518 SO_RCVBUF, /**< @brief This option defines the maximum per-socket 00519 * buffer size for input data. 00520 */ 00521 SO_STATE, /**< @brief This option defines the current state of the socket.@n 00522 * This is the read-only option and it is defined by the @ref fnet_socket_state_t type. 00523 */ 00524 SO_ERROR, /**< @brief This option returns a per-socket-based error code.@n 00525 * The error code is defined by the @ref fnet_error_t type.@n 00526 * After the error value has been read in the @ref fnet_socket_getopt function, it is cleared. 00527 * But a successful call using the socket routines does not clear 00528 * the socket-based error. 00529 */ 00530 SO_TYPE, /**< @brief This option defines the type of the socket. 00531 * This is a read-only option and it is defined by the @ref fnet_socket_type_t type. 00532 */ 00533 SO_RCVNUM, /**< @brief This option is used to determine the amount of data 00534 * pending in the socket-input buffer.@n 00535 * This is a read-only option. 00536 */ 00537 SO_SNDNUM,/**< @brief This option is used to determine the amount of data 00538 * in the socket output buffer. @n 00539 * This is a read-only option. 00540 */ 00541 /* TCP level (IPPROTO_TCP) options */ 00542 00543 TCP_MSS, /**< @brief This option defines the maximum size of 00544 * the input segments (MSS). @n 00545 * The TCP Maximum Segment Size (MSS) defines the maximum amount 00546 * of data that a host is willing to accept in a single TCP segment.@n 00547 * This Maximum Segment Size (MSS) announcement is sent from the 00548 * data receiver to the data sender and says "I can accept TCP segments 00549 * up to size X". The size (X) may be larger or smaller than the 00550 * default.@n 00551 * The MSS counts only data octets in the segment, it does not count the 00552 * TCP header or the IP header.@n 00553 * The default value is defined by the @ref FNET_CFG_SOCKET_TCP_MSS 00554 * user-configuration option. @n 00555 * This option can be set to: 00556 * - @c 0 = The selection of the MSS is 00557 * automatic and is based on the MTU of the outgoing 00558 * interface minus 40 (does not include 00559 * the 20 byte IP header and the 20 byte TCP header).@n 00560 * It is done to assist in avoiding of IP fragmentation 00561 * at the endpoints of the TCP connection. 00562 * - Non-zero value (up to 64K) = The TCP segment could be as large as 64K 00563 * (the maximum IP datagram size), but it could be fragmented 00564 * at the IP layer in order to be transmitted 00565 * across the network to the receiving host. 00566 */ 00567 TCP_BSD, /**< @brief If this option is set to @c 1, the BSD interpretation of 00568 * the urgent pointer is used. In this case the 00569 * urgent pointer of the TCP segment points to 00570 * the next byte following after the urgent byte. 00571 * Most of the TCP implementations use this 00572 * interpretation by default.@n 00573 * If this option is set to @c 0, the interpretation of 00574 * the TCP specification is used. In this case the 00575 * urgent pointer of the TCP segment points 00576 * to the urgent byte. @n 00577 * This option is avalable only if 00578 * @ref FNET_CFG_TCP_URGENT is set to @c 1. 00579 */ 00580 TCP_NODELAY, /**< @brief If this option is set to @c 1, the Nagle algorithm 00581 * is disabled (and vice versa). @n 00582 * The Nagle algorithm is effective in reducing the number 00583 * of small packets sent by the host by essentially buffering 00584 * send data, if there is unacknowledged data already "in flight", 00585 * or until a full-size packet can be sent.@n 00586 * But for some applications this algorithm can impede 00587 * performance, especially for a bulky data transfer. 00588 */ 00589 TCP_FINRCVD, /**< @brief This option is set when the final (FIN) segment arrives. @n 00590 * This option indicates that another side will not send any data 00591 * in the current connection.@n 00592 * This is the read-only option. 00593 */ 00594 TCP_URGRCVD, /**< @brief This option is set when the urgent byte arrives, and 00595 * reset when this byte is read.@n 00596 * This option can be set only if the @ref SO_OOBINLINE option is set to @c 0.@n 00597 * This is the read-only option. @n 00598 * This option is avalable only if 00599 * @ref FNET_CFG_TCP_URGENT is set to @c 1. 00600 */ 00601 TCP_KEEPIDLE, /**< @brief When the @ref SO_KEEPALIVE option is enabled, TCP probes a connection that 00602 * has been idle for some amount of time. The default value for this idle 00603 * period is @c 7200 seconds (2 hours). The @ref TCP_KEEPIDLE option can be used to affect this 00604 * value for a given socket, and specifies the number of seconds of idle 00605 * time between keepalive probes. 00606 */ 00607 TCP_KEEPINTVL, /**< @brief When the @ref SO_KEEPALIVE option is enabled, TCP probes a connection that 00608 * has been idle for some amount of time. If the remote system does not 00609 * respond to a keepalive probe, TCP retransmits the probe after some 00610 * amount of time. The default value for this retransmit interval is @c 75 00611 * seconds. The @ref TCP_KEEPINTVL option can be used to affect this value for 00612 * a given socket, and specifies the number of seconds to wait before 00613 * retransmitting a keepalive probe. 00614 */ 00615 TCP_KEEPCNT, /**< @brief When the @ref SO_KEEPALIVE option is enabled, TCP probes a connection that 00616 * has been idle for some amount of time. If the remote system does not 00617 * respond to a keepalive probe, TCP retransmits the probe a certain 00618 * number of times before a connection is considered to be broken. The 00619 * default value for this keepalive probe retransmit limit is @c 8. The 00620 * @ref TCP_KEEPCNT option can be used to affect this value for a given socket, 00621 * and specifies the maximum number of keepalive probes to be sent. 00622 */ 00623 00624 /* IPv4 level (IPPROTO_IP) options */ 00625 00626 IP_TOS , /**< @brief This option defines the IPv4 TOS 00627 * (type-of-service) field for outgoing datagrams. 00628 */ 00629 IP_TTL , /**< @brief This option defines the IPv4 TTL 00630 * (time-to-live) vlaue for outgoing datagrams. 00631 */ 00632 IP_MULTICAST_TTL , /**< @brief This option allows to change IPv4 "time to live" (TTL) 00633 * value for outgoing multicast datagrams. 00634 * Otherwise, multicast datagrams are sent with a default value of 1, 00635 * to prevent them to be forwarded beyond the local network.@n 00636 * This option is available only if @ref FNET_CFG_MULTICAST is set to @c 1. 00637 */ 00638 IP_ADD_MEMBERSHIP, /**< @brief Join the socket to the IPv4 multicast group on 00639 * the specified interface. It tells the system to receive packets on 00640 * the network whose destination is the group address (but not its own). 00641 * It is valid only for the SOCK_DGRAM (UDP) sockets.@n 00642 * This option is available only if @ref FNET_CFG_MULTICAST is set to @c 1. 00643 */ 00644 IP_DROP_MEMBERSHIP, /**< @brief Drops membership to a IPv4 multicast group and interface.@n 00645 * This option is available only if @ref FNET_CFG_MULTICAST is set to @c 1. 00646 */ 00647 /* IPv6 level (IPPROTO_IPV6) options */ 00648 00649 IPV6_UNICAST_HOPS, /**< @brief This option defines hop limit used 00650 * for outgoing unicast IPv6 packets. @n 00651 * Its value can be from 0 till 255.@n 00652 * By default the option is set to 0. It means that the hop limit is defined 00653 * by local IPv6 router, otherwise it equals to 64. 00654 */ 00655 IPV6_MULTICAST_HOPS, /**< @brief Set the hop limit to use for outgoing multicast IPv6 packets.@n 00656 * If IPV6_MULTICAST_HOPS is not set, the default is 1. 00657 */ 00658 IPV6_JOIN_GROUP, /**< @brief (RFC3493) Join a multicast group on a specified local interface.@n 00659 * It is valid only for the SOCK_DGRAM (UDP) sockets. 00660 */ 00661 IPV6_LEAVE_GROUP /**< @brief (RFC3493) Leave a multicast group on a specified interface.@n 00662 * It is valid only for the SOCK_DGRAM (UDP) sockets. 00663 */ 00664 } fnet_socket_options_t; 00665 00666 /**************************************************************************/ /*! 00667 * @brief This structure is used for the @ref SO_LINGER option. 00668 ******************************************************************************/ 00669 struct linger 00670 { 00671 fnet_bool_t l_onoff; /**< @brief Determines, whether the option will be 00672 * turned on @c FNET_TRUE, or off @c FNET_FALSE. 00673 */ 00674 fnet_uint16_t l_linger; /**< @brief Specifies the amount of time (in seconds) 00675 * to wait when the connection is closed and unsent data 00676 * is discarded. 00677 * If @c l_onoff is @c 0, the @c l_linger value is ignored 00678 * and the stack continues to try to send the data as usually. 00679 */ 00680 }; 00681 00682 /**************************************************************************/ /*! 00683 * @brief Socket descriptor. 00684 ******************************************************************************/ 00685 typedef void* fnet_socket_t; 00686 00687 /**************************************************************************/ /*! 00688 * @brief The flags parameters for receiving and sending functions 00689 * @ref fnet_socket_recv(), @ref fnet_socket_recvfrom(), @ref fnet_socket_send(), and @ref fnet_socket_sendto(). 00690 * 00691 * The optional flag specifies the way, in which the call is made. 00692 * It can be constructed by using the bitwise OR. 00693 ******************************************************************************/ 00694 typedef enum 00695 { 00696 MSG_OOB = (0x1U), /**< @brief Process out-of-band 00697 * data instead of regular data. @n 00698 * This option is avalable only if 00699 * @ref FNET_CFG_TCP_URGENT is set to @c 1. 00700 */ 00701 MSG_PEEK = (0x2U), /**< @brief Receive a copy of the 00702 * data without consuming it. 00703 */ 00704 MSG_DONTROUTE = (0x4U) /**< @brief Send without using 00705 * routing tables. 00706 */ 00707 } fnet_msg_flags_t; 00708 00709 /**************************************************************************/ /*! 00710 * @brief The flags used by @ref fnet_socket_shutdown(). 00711 * 00712 * They describe what types of socket operation will no longer be allowed. 00713 ******************************************************************************/ 00714 typedef enum 00715 { 00716 SD_READ = (0x1U), /**< @brief Data receiving is disabled. 00717 */ 00718 SD_WRITE = (0x2U), /**< @brief Data sending is disabled. 00719 */ 00720 SD_BOTH = (SD_READ | SD_WRITE) /**< @brief Both receiving and 00721 * sending are disabled. 00722 */ 00723 } fnet_sd_flags_t; 00724 00725 #if defined(__cplusplus) 00726 extern "C" { 00727 #endif 00728 00729 /***************************************************************************/ /*! 00730 * 00731 * @brief Creates a socket. 00732 * 00733 * 00734 * @param family Address family that the socket will use, defined 00735 * by the @ref fnet_address_family_t. 00736 * 00737 * @param type Type specification for the new socket, defined by @ref 00738 * fnet_socket_type_t. It can be @ref SOCK_STREAM (TCP) or 00739 * @ref SOCK_DGRAM (UDP). 00740 * 00741 * @param protocol Protocol to be used with the socket that is specific to 00742 * the indicated address family. This stack supports 00743 * @ref IPPROTO_TCP and @ref IPPROTO_UDP.@n 00744 * This parameter is optional, and can be set to zero, as 00745 * the @c type already defines the proper protocol. 00746 * 00747 * @return This function returns: 00748 * - Socket descriptor referencing the new socket, if no error occurs. 00749 * - @ref FNET_NULL if an error occurs. @n 00750 * The specific error code can be retrieved using the @ref fnet_error_get(). 00751 * 00752 * @see fnet_socket_close() 00753 * 00754 ****************************************************************************** 00755 * 00756 * This function creates a socket and returns its descriptor.@n 00757 * The @ref fnet_socket() function causes a socket descriptor and any related 00758 * resources to be allocated and bound to a specific transport-service 00759 * provider that supports the requested combination of address family, 00760 * socket type, and protocol parameters.@n 00761 * @n 00762 * After a socket is created: 00763 * - Connection-oriented sockets, such as the @ref SOCK_STREAM, provide 00764 * full-duplex connections. Before any data can be sent or received, 00765 * it must be in a connected state . A connection to 00766 * another socket is established with the @ref fnet_socket_connect() call. 00767 * Once connected, the data can be transferred using the @ref fnet_socket_send() and the @ref 00768 * fnet_socket_recv() calls. When a session has been completed, the @ref fnet_socket_close() 00769 * must be performed. 00770 * - Connectionless, message-oriented sockets, such as the @ref SOCK_DGRAM, allow 00771 * sending and receiving of datagrams to and from arbitrary peers using 00772 * the @ref fnet_socket_sendto() and the @ref fnet_socket_recvfrom(). If such a socket is connected 00773 * to a specific peer, datagrams can be sent to that peer using the 00774 * @ref fnet_socket_send(), and can be received only from this peer using the @ref fnet_socket_recv(). 00775 * 00776 ******************************************************************************/ 00777 fnet_socket_t fnet_socket( fnet_address_family_t family, fnet_socket_type_t type, fnet_uint32_t protocol ); 00778 00779 /***************************************************************************/ /*! 00780 * 00781 * @brief Assigns a local address to a socket. 00782 * 00783 * 00784 * @param s Descriptor, identifying a socket to bind. 00785 * 00786 * @param name The address to be assigned to the socket, from the @ref 00787 * sockaddr structure. 00788 * 00789 * @param namelen The length of the @c name parameter. 00790 * Normally @c namelen is set to @c sizeof(name). 00791 * 00792 * @return This function returns: 00793 * - @ref FNET_OK if no error occurs. 00794 * - @ref FNET_ERR if an error occurs. @n 00795 * The specific error code can be retrieved using the @ref fnet_error_get(). 00796 * 00797 * @see fnet_socket() 00798 * 00799 ****************************************************************************** 00800 * 00801 * This function associates a local address with the socket.@n 00802 * The @ref fnet_socket_bind() function is used on an unconnected socket before 00803 * subsequent calls to the @ref fnet_socket_connect() or the @ref fnet_socket_listen() functions. 00804 * It is used to bind to either connection-oriented (stream) or connectionless 00805 * (datagram) sockets.@n 00806 * Within the @ref sockaddr structure, the address may be the address assigned 00807 * to a network interface on the host or the @ref INADDR_ANY. 00808 * Using the @ref INADDR_ANY causes the stack to use the default network 00809 * interface address. Using a port number of 0 causes the service provider 00810 * to assign a unique port to the socket with a value between 1024 and 5000. 00811 * 00812 ******************************************************************************/ 00813 fnet_return_t fnet_socket_bind( fnet_socket_t s, const struct sockaddr *name, fnet_size_t namelen ); 00814 00815 /***************************************************************************/ /*! 00816 * 00817 * @brief Places the socket into a state, where it is listening for 00818 * an incoming connection. 00819 * 00820 * 00821 * @param s Descriptor identifying a socket that will be 00822 * used for listening. 00823 * 00824 * @param backlog Maximum length of the queue of pending connections. 00825 * 00826 * 00827 * @return This function returns: 00828 * - @ref FNET_OK if no error occurs. 00829 * - @ref FNET_ERR if an error occurs. @n 00830 * The specific error code can be retrieved using the @ref fnet_error_get(). 00831 * 00832 * @see fnet_socket(), fnet_socket_bind(), fnet_socket_accept() 00833 * 00834 ****************************************************************************** 00835 * 00836 * Only connection-oriented sockets (@ref SOCK_STREAM) are used with the 00837 * @ref fnet_socket_listen().@n 00838 * The socket is put into passive mode, where the incoming connection 00839 * requests are acknowledged and queued pending acceptance by the listening socket. 00840 * The @ref fnet_socket_listen() function is typically used by servers that can have 00841 * more than one connection request at a time. @n 00842 * An application can call @ref fnet_socket_listen() more than once on the same socket. 00843 * If there are more pending connections than the new backlog value, 00844 * the excess pending connections will be reset and dropped. 00845 * 00846 ******************************************************************************/ 00847 fnet_return_t fnet_socket_listen( fnet_socket_t s, fnet_size_t backlog ); 00848 00849 /***************************************************************************/ /*! 00850 * 00851 * @brief Accepts a connection on the specified socket. 00852 * 00853 * 00854 * @param s Descriptor, identifying an unconnected socket. 00855 * 00856 * @param addr Optional pointer to a buffer that receives the address 00857 * of the remote host at the other end of the connection. 00858 * 00859 * @param addrlen Optional pointer to an integer that contains the 00860 * length of the @c addr parameter. 00861 * 00862 * 00863 * @return This function returns: 00864 * - Socket descriptor referencing the new socket, if no error occurs. 00865 * - @ref FNET_NULL if an error occurs. @n 00866 * The specific error code can be retrieved using @ref fnet_error_get(). 00867 * 00868 * @see fnet_socket(), fnet_socket_bind() 00869 * 00870 ****************************************************************************** 00871 * 00872 * The function extracts the first connection in the queue of pending 00873 * connections on the listening socket @c s, and returns the new socket descriptor.@n 00874 * The newly-created socket is the socket that will handle the actual 00875 * connection and has the same properties as the socket @c s. 00876 * The original socket remains open and listens for new connection requests. 00877 * If no pending connections are present in the queue of the socket, 00878 * the @ref fnet_socket_accept() returns FNET_NULL and the specific error code is set to 00879 * @ref FNET_ERR_AGAIN.@n 00880 * The parameter @c addr is a result parameter that is filled in with the 00881 * address of the remote host. The @c addrlen should initially contain the 00882 * amount of space pointed to by the @c addr; on return it will contain the 00883 * actual length of the address returned (in bytes).@n 00884 * The @ref fnet_socket_accept() function is used only with connection-oriented socket 00885 * types (@ref SOCK_STREAM).@n 00886 * If @c addr and/or @c addrlen are equal to @c 0, then no information 00887 * about the remote address of the accepted socket is returned. 00888 * 00889 ******************************************************************************/ 00890 fnet_socket_t fnet_socket_accept( fnet_socket_t s, struct sockaddr *addr, fnet_size_t *addrlen ); 00891 00892 /***************************************************************************/ /*! 00893 * 00894 * @brief Establishes a connection with the specified socket. 00895 * 00896 * 00897 * @param s Descriptor identifying an unconnected socket. 00898 * 00899 * @param name Address (name) of the socket, with which the connection 00900 * should be established. 00901 * 00902 * @param namelen Length of the @c name. 00903 * 00904 * 00905 * @return This function returns: 00906 * - @ref FNET_OK if no error occurs. 00907 * - @ref FNET_ERR if an error occurs. @n 00908 * The specific error code can be retrieved using the @ref fnet_error_get(). 00909 * 00910 * @see fnet_socket(), fnet_socket_bind() 00911 * 00912 ****************************************************************************** 00913 * 00914 * For connection-oriented sockets (@ref SOCK_STREAM), this function activates 00915 * an active connection with the foreign host. 00916 * 00917 * When the socket call completes successfully, the socket is ready to send 00918 * and receive data. Any attempt to reconnect the active connection will fail 00919 * with the error code @ref FNET_ERR_ISCONN. For connection-oriented 00920 * sockets, it is often not possible to complete the connection 00921 * immediately. Until the connection attempt 00922 * completes on a socket, all subsequent calls to @ref fnet_socket_connect() 00923 * on the same socket will fail with the error code @ref FNET_ERR_INPROGRESS, 00924 * or succeed with @ref FNET_ERR_ISCONN when the connection completes successfully. 00925 * Use the @ref fnet_socket_getopt() function to determine the completion of the 00926 * connection request by checking the @ref SO_STATE to see if the socket is 00927 * connected (@ref SS_CONNECTED), is still connecting (@ref SS_CONNECTING) 00928 * or the connection has failed (@ref SS_UNCONNECTED). @n 00929 * @n 00930 * For a connectionless socket (@ref SOCK_DGRAM), the operation performed 00931 * by @ref fnet_socket_connect() is merely to establish a default destination address 00932 * that can be used on subsequent @ref fnet_socket_send() and @ref fnet_socket_recv() calls. 00933 * Any datagrams received from an address other than the destination address 00934 * specified will be discarded. The default destination can be changed by 00935 * simply calling the @ref fnet_socket_connect() again, even if the socket is connected already. 00936 * Any datagrams queued for receipt are discarded from the previous 00937 * @ref fnet_socket_connect(). For connectionless sockets, the @c name can indicate any 00938 * valid address, including a broadcast address.@n 00939 * @n 00940 * If the socket @c s is unbound, unique values are assigned to the local 00941 * association by the stack, and the socket is marked as bound. 00942 * 00943 ******************************************************************************/ 00944 fnet_return_t fnet_socket_connect( fnet_socket_t s, struct sockaddr *name, fnet_size_t namelen ); 00945 00946 /***************************************************************************/ /*! 00947 * 00948 * @brief Receives the data from a connected socket. 00949 * 00950 * 00951 * @param s Descriptor identifying a connected socket. 00952 * 00953 * @param buf Buffer for the incoming data. 00954 * 00955 * @param len Length of the @c buf. 00956 * 00957 * @param flags Optional flag specifying the way, in which the call is made. 00958 * It can be constructed by using the bitwise OR operator with 00959 * any of the values defined by the @ref fnet_msg_flags_t. 00960 * 00961 * 00962 * @return This function returns: 00963 * - The number of bytes received, if no error occurs. 00964 * The return value is set to zero, if there 00965 * is no input data. 00966 * - @ref FNET_ERR if an error occurs. @n 00967 * The specific error code can be retrieved using the @ref fnet_error_get(). 00968 * 00969 * @see fnet_socket_connect(), fnet_socket_recvfrom() 00970 * 00971 ****************************************************************************** 00972 * 00973 * For connection-oriented sockets (@ref SOCK_STREAM), calling the @ref fnet_socket_recv() 00974 * will return as much information as is currently available up to the size 00975 * of the buffer supplied.@n 00976 * @n 00977 * For connectionless sockets (@ref SOCK_DGRAM), the data is extracted from the 00978 * first enqueued datagram (message), whose destination address is specified 00979 * by the @ref fnet_socket_connect() function. 00980 * If the datagram is larger than the supplied buffer, the buffer is filled 00981 * with the first part of the datagram, and the @ref fnet_socket_recv() generates the error 00982 * @ref FNET_ERR_MSGSIZE and the excess data is lost.@n 00983 * @n 00984 * The @c flags parameter can be used to influence the behavior of the function 00985 * invocation beyond the options specified for the associated socket. 00986 * 00987 ******************************************************************************/ 00988 fnet_int32_t fnet_socket_recv( fnet_socket_t s, fnet_uint8_t *buf, fnet_size_t len, fnet_flag_t flags ); 00989 00990 /***************************************************************************/ /*! 00991 * 00992 * @brief Receives the data and captures the address, from which the data 00993 * was sent. 00994 * 00995 * 00996 * @param s Descriptor, identifying a bound socket. 00997 * 00998 * @param buf Buffer for the incoming data. 00999 * 01000 * @param len Length of the @c buf. 01001 * 01002 * @param flags Optional flag specifying the way in which the call is made. 01003 * It can be constructed by using the bitwise OR operator with 01004 * any of the values defined by the @ref fnet_msg_flags_t. 01005 * 01006 * @param from Optional pointer to a buffer that will hold the 01007 * source address upon return. 01008 * 01009 * @param fromlen Optional pointer to the size of the @c from buffer. 01010 * 01011 * 01012 * @return This function returns: 01013 * - The number of bytes received, if no error occurs. 01014 * The return value is set to zero, if the socket is nonblocking and there 01015 * is no input data. 01016 * - @ref FNET_ERR if an error occurs. @n 01017 * The specific error code can be retrieved using the @ref fnet_error_get(). 01018 * 01019 * @see fnet_socket_bind(), fnet_socket_recv() 01020 * 01021 ****************************************************************************** 01022 * 01023 * For connection-oriented sockets (@ref SOCK_STREAM), calling the @ref fnet_socket_recvfrom() 01024 * will return as much information as is currently available up to the size of 01025 * the buffer supplied. The @ref fnet_socket_recvfrom() call is rarely used for 01026 * stream sockets, because the routine provides the peer-socket information, 01027 * and stream sockets are tied to a specific peer.@n 01028 * @n 01029 * For connectionless sockets (@ref SOCK_DGRAM), the data is extracted from the 01030 * first enqueued datagram. 01031 * If the datagram is larger than the buffer supplied, the buffer is filled 01032 * with the first part of the datagram, and the @ref fnet_socket_recvfrom() generates the 01033 * error @ref FNET_ERR_MSGSIZE and the excess data is lost.@n 01034 * @n 01035 * If the @c from parameter is non-zero, the network address of the peer 01036 * that sent the data is copied to the corresponding @ref sockaddr structure. 01037 * The value pointed to by @c fromlen is initialized to the size of this 01038 * structure and is modified on return, to indicate the actual size of 01039 * the address stored in the @ref sockaddr structure.@n 01040 * @n 01041 * The flags parameter can be used to influence the behavior of the function 01042 * invocation beyond the options specified for the associated socket. 01043 * 01044 ******************************************************************************/ 01045 fnet_int32_t fnet_socket_recvfrom( fnet_socket_t s, fnet_uint8_t *buf, fnet_size_t len, fnet_flag_t flags, struct sockaddr *from, fnet_size_t *fromlen ); 01046 01047 /***************************************************************************/ /*! 01048 * 01049 * @brief Sends the data on a connected socket. 01050 * 01051 * 01052 * @param s Descriptor, identifying a connected socket. 01053 * 01054 * @param buf Buffer containing the data to be transmitted. 01055 * 01056 * @param len Length of the data in @c buf. 01057 * 01058 * @param flags Optional flag specifying the way in which the call is made. 01059 * It can be constructed by using the bitwise OR operator with 01060 * any of the values defined by the @ref fnet_msg_flags_t. 01061 * 01062 * 01063 * @return This function returns: 01064 * - The total number of bytes sent, if no error occurs. 01065 * It can be less than the number indicated by @c len. 01066 * - @ref FNET_ERR if an error occurs. @n 01067 * The specific error code can be retrieved using the @ref fnet_error_get(). 01068 * 01069 * @see fnet_socket_connect(), fnet_socket_sendto() 01070 * 01071 ****************************************************************************** 01072 * 01073 * For stream-oriented sockets (@ref SOCK_STREAM), the number of 01074 * actually sent bytes can be between @c 0 and the requested length, depending on 01075 * buffer availability on both client and server machines.@n 01076 * @n 01077 * For message-oriented sockets (@ref SOCK_DGRAM), care must be taken not to 01078 * exceed the maximum datagram size, which can be obtained by using the @ref 01079 * fnet_socket_getopt() to retrieve the value of the socket option @ref SO_SNDBUF. 01080 * If the data is too long to pass atomically through the underlying 01081 * datagram protocol, the error @ref FNET_ERR_MSGSIZE is returned 01082 * and no data is transmitted.@n 01083 * Calling the @ref fnet_socket_send() with a zero @c len parameter is permissible. 01084 * In such cases, the @ref fnet_socket_send() will return zero as a valid value, and 01085 * for message-oriented sockets (@ref SOCK_DGRAM) a zero-length transport 01086 * datagram is sent.@n 01087 * @n 01088 * The @c flags parameter can be used to influence the behavior of the function 01089 * invocation beyond the options specified for the associated socket. 01090 * 01091 ******************************************************************************/ 01092 fnet_int32_t fnet_socket_send( fnet_socket_t s, fnet_uint8_t *buf, fnet_size_t len, fnet_flag_t flags ); 01093 01094 /***************************************************************************/ /*! 01095 * 01096 * @brief Sends the data to a specific destination. 01097 * 01098 * 01099 * @param s Descriptor, identifying a socket. 01100 * 01101 * @param buf Buffer containing the data to be transmitted. 01102 * 01103 * @param len Length of the data in @c buf. 01104 * 01105 * @param flags Optional flag specifying the way, in which the call is made. 01106 * It can be constructed by using the bitwise OR operator with 01107 * any of the values defined by the @ref fnet_msg_flags_t. 01108 * 01109 * @param to Pointer to the address of the target socket. 01110 * 01111 * @param tolen Size of the address in @c to. 01112 * 01113 * 01114 * @return This function returns: 01115 * - The total number of bytes sent, if no error occurs. 01116 * It can be lesser than the number indicated by @c len. 01117 * - @ref FNET_ERR if an error occurs. @n 01118 * The specific error code can be retrieved using the @ref fnet_error_get(). 01119 * 01120 * @see fnet_socket_connect(), fnet_socket_send() 01121 * 01122 ****************************************************************************** 01123 * 01124 * For nonb-locking stream-oriented sockets (@ref SOCK_STREAM), the number of 01125 * actually sent bytes can be between @c 1 and the requested length, depending on 01126 * buffer availability on both client and server machines.@n 01127 * @n 01128 * For message-oriented sockets (@ref SOCK_DGRAM), care must be taken not not 01129 * exceed the maximum datagram size, which can be obtained by using the @ref 01130 * fnet_socket_getopt() to retrieve the value of the socket option @ref SO_SNDBUF. 01131 * If the data is too long to pass atomically through the underlying 01132 * datagram protocol, the error @ref FNET_ERR_MSGSIZE is returned 01133 * and no data is transmitted.@n 01134 * Calling @ref fnet_socket_sendto() with a zero @c len parameter is permissible. 01135 * In such cases, the @ref fnet_socket_sendto() will return zero as a valid value, and 01136 * for message-oriented sockets (@ref SOCK_DGRAM), a zero-length transport 01137 * datagram is sent.@n 01138 * @n 01139 * The @ref fnet_socket_sendto() function is normally used on a connectionless socket 01140 * (@ref SOCK_DGRAM) to send a datagram to a specific peer socket identified 01141 * by the @c to parameter. Even if the connectionless socket has been previously 01142 * connected to a specific address, the @c to parameter overrides the 01143 * destination address for that particular datagram only.@n 01144 * On a connection-oriented socket (@ref SOCK_STREAM), the @c to and @c tolen 01145 * parameters are ignored, making the @ref fnet_socket_sendto() equivalent to @ref fnet_socket_send().@n 01146 * @n 01147 * The @c flags parameter can be used to influence the behavior of the function 01148 * invocation beyond the options specified for the associated socket. 01149 * 01150 ******************************************************************************/ 01151 fnet_int32_t fnet_socket_sendto( fnet_socket_t s, fnet_uint8_t *buf, fnet_size_t len, fnet_flag_t flags, const struct sockaddr *to, fnet_size_t tolen ); 01152 01153 /***************************************************************************/ /*! 01154 * 01155 * @brief Terminates the connection in one or both directions. 01156 * 01157 * 01158 * @param s Descriptor, identifying a socket. 01159 * 01160 * @param how Flag that describes what types of operation will no longer 01161 * be allowed, it's defined by the @ref fnet_sd_flags_t. 01162 * 01163 * 01164 * @return This function returns: 01165 * - @ref FNET_OK if no error occurs. 01166 * - @ref FNET_ERR if an error occurs. @n 01167 * The specific error code can be retrieved using the @ref fnet_error_get(). 01168 * 01169 * @see fnet_socket_close() 01170 * 01171 ****************************************************************************** 01172 * 01173 * This function is used on all types of sockets to disable reception, 01174 * transmission, or both.@n 01175 * If the @c how parameter is @ref SD_READ, subsequent calls to the @ref fnet_socket_recv() 01176 * function on the socket will be unallowed. If the @c how parameter is 01177 * @ref SD_WRITE, subsequent calls to the @ref fnet_socket_send() function are unallowed. 01178 * Setting the @c how to the @ref SD_BOTH disables both sends and receives as 01179 * described above.@n 01180 * The @ref fnet_socket_shutdown() function does not close the socket. Any resources 01181 * attached to the socket will not be freed until the @ref fnet_socket_close() is invoked. 01182 * 01183 ******************************************************************************/ 01184 fnet_return_t fnet_socket_shutdown( fnet_socket_t s, fnet_sd_flags_t how ); 01185 01186 /***************************************************************************/ /*! 01187 * 01188 * @brief Closes an existing socket. 01189 * 01190 * @param s Descriptor, identifying a socket to close. 01191 * 01192 * @return This function returns: 01193 * - @ref FNET_OK if no error occurs. 01194 * - @ref FNET_ERR if an error occurs. @n 01195 * The specific error code can be retrieved using the @ref fnet_error_get(). 01196 * 01197 * @see fnet_socket() 01198 * 01199 ****************************************************************************** 01200 * 01201 * This function releases the socket descriptor @c s, so that further 01202 * references to @c s fail with the error @ref FNET_ERR_BAD_DESC.@n 01203 * An application should always have a matching call to the @ref fnet_socket_close() for 01204 * each successful call to the @ref fnet_socket() to return any socket resources to 01205 * the system.@n 01206 * @n 01207 * For the @ref SOCK_STREAM sockets, the @ref SO_LINGER option controls the action 01208 * of the closing, when unsent data is present on the socket and the @ref 01209 * fnet_socket_close() function is performed. This option has effect on 01210 * TCP sockets only. To enable or disable the @ref SO_LINGER option, the application 01211 * should use the @ref linger structure. This structure includes the 01212 * @c l_onoff and the @c l_linger fields. If the @c l_onoff has a non-zero value, 01213 * then the @ref SO_LINGER is enabled. Otherwise, the @ref SO_LINGER option is 01214 * disabled. The @c l_linger field includes the timeout in seconds. 01215 * If the @ref SO_LINGER option is not used 01216 * , the remaining data of the output buffer can be sent after the execution 01217 * of the @ref fnet_socket_close() in the background.@n 01218 * If a timeout expires and unsent data is present, the hard reset occurs and 01219 * unsent data will be deleted.@n 01220 * If the @ref SO_LINGER option is used with a zero timeout interval, the 01221 * hard reset occurs immediately and unsent data will be deleted. 01222 * 01223 ******************************************************************************/ 01224 fnet_return_t fnet_socket_close( fnet_socket_t s ); 01225 01226 /***************************************************************************/ /*! 01227 * 01228 * @brief Sets a socket option. 01229 * 01230 * 01231 * @param s Descriptor identifying a socket. 01232 * 01233 * @param level Level, at which the option is defined. 01234 * The supported levels are @ref SOL_SOCKET, 01235 * @ref IPPROTO_IP, @ref IPPROTO_IPV6 or @ref IPPROTO_TCP. 01236 * 01237 * @param optname Socket option for which the value is to be set. 01238 * 01239 * @param optval Pointer to a buffer, in which the value for the requested 01240 * option is supplied. 01241 * 01242 * @param optvallen Size of the @c optval buffer. 01243 * 01244 * 01245 * @return This function returns: 01246 * - @ref FNET_OK if no error occurs. 01247 * - @ref FNET_ERR if an error occurs. @n 01248 * The specific error code can be retrieved using the @ref fnet_error_get(). 01249 * 01250 * @see fnet_socket_getopt() 01251 * 01252 ****************************************************************************** 01253 * 01254 * This function sets the current value for a socket option associated with the 01255 * specified socket.@n 01256 * The various socket options are described by the @ref fnet_socket_options_t. 01257 * 01258 ******************************************************************************/ 01259 fnet_return_t fnet_socket_setopt( fnet_socket_t s, fnet_protocol_t level, fnet_socket_options_t optname, const void *optval, fnet_size_t optvallen ); 01260 01261 /***************************************************************************/ /*! 01262 * 01263 * @brief Gets a socket option. 01264 * 01265 * 01266 * @param s Descriptor identifying a socket. 01267 * 01268 * @param level Level, at which the option is defined. 01269 * The supported levels are the @ref SOL_SOCKET, 01270 * @ref IPPROTO_IP, @ref IPPROTO_IPV6 or @ref IPPROTO_TCP. 01271 * 01272 * @param optname Socket option, for which the value is to be retrievied. 01273 * 01274 * @param optval Pointer to a buffer in which the value for the requested 01275 * option has to be returned. 01276 * 01277 * @param optvallen Pointer to the size of the @c optval buffer. 01278 * 01279 * 01280 * @return This function returns: 01281 * - @ref FNET_OK if no error occurs. 01282 * - @ref FNET_ERR if an error occurs. @n 01283 * The specific error code can be retrieved using the @ref fnet_error_get(). 01284 * 01285 * @see fnet_socket_setopt() 01286 * 01287 ****************************************************************************** 01288 * 01289 * This function retrieves the current value for a socket option associated 01290 * with the socket @c s, and stores the result in the @c optval.@n 01291 * The various socket options are described by the @ref fnet_socket_options_t. 01292 * 01293 ******************************************************************************/ 01294 fnet_return_t fnet_socket_getopt( fnet_socket_t s, fnet_protocol_t level, fnet_socket_options_t optname, void *optval, fnet_size_t *optvallen ); 01295 01296 /***************************************************************************/ /*! 01297 * 01298 * @brief Retrieves the name of a peer connected to a socket. 01299 * 01300 * 01301 * @param s Descriptor identifying a connected socket. 01302 * 01303 * @param name Structure that receives the name (address) of the peer. 01304 * 01305 * @param namelen Pointer to the size of the @c name structure. 01306 * 01307 * 01308 * @return This function returns: 01309 * - @ref FNET_OK if no error occurs. 01310 * - @ref FNET_ERR if an error occurs. @n 01311 * The specific error code can be retrieved using the @ref fnet_error_get(). 01312 * 01313 * @see fnet_socket_getname() 01314 * 01315 ****************************************************************************** 01316 * 01317 * This function retrieves the name of the peer connected to the socket @c s 01318 * and stores it in the @ref sockaddr structure identified by @c name.@n 01319 * The @ref fnet_socket_getpeername() function can be used only with a connected socket. 01320 * For datagram sockets, only the name of a peer specified in a previous 01321 * @ref fnet_socket_connect() call will be returned - any name specified by a previous 01322 * @ref fnet_socket_sendto() call will not be returned by the @ref fnet_socket_getpeername(). 01323 * 01324 ******************************************************************************/ 01325 fnet_return_t fnet_socket_getpeername( fnet_socket_t s, struct sockaddr *name, fnet_size_t *namelen ); 01326 01327 /***************************************************************************/ /*! 01328 * 01329 * @brief Retrieves the current name for the specified socket. 01330 * 01331 * 01332 * @param s Descriptor identifying a socket. 01333 * 01334 * @param name Structure that receives the name (address) of the 01335 * socket @c s. 01336 * 01337 * @param namelen Pointer to the size of the @c name structure. 01338 * 01339 * 01340 * @return This function returns: 01341 * - @ref FNET_OK if no error occurs. 01342 * - @ref FNET_ERR if an error occurs. @n 01343 * The specific error code can be retrieved using the @ref fnet_error_get(). 01344 * 01345 * @see fnet_socket_getpeername() 01346 * 01347 ****************************************************************************** 01348 * 01349 * This function retrieves the current name for the specified socket @c s 01350 * and stores it in the @c name.@n 01351 * It is used on a bound or connected socket. 01352 * 01353 ******************************************************************************/ 01354 fnet_return_t fnet_socket_getname( fnet_socket_t s, struct sockaddr *name, fnet_size_t *namelen ); 01355 01356 /***************************************************************************/ /*! 01357 * 01358 * @brief Compares socket addresses. 01359 * 01360 * @param addr1 First socket address to be compared. 01361 * 01362 * @param addr2 Second socket address to be compared. 01363 * 01364 * @return This function returns: 01365 * - @ref FNET_TRUE if addresses are equal. 01366 * - @ref FNET_FALSE if addresses are not equal. 01367 * 01368 ****************************************************************************** 01369 * 01370 * This function compares specified socket addresses, depending on address family. @n 01371 * Port number and Scope Id do not take part in process of comparison. 01372 * 01373 ******************************************************************************/ 01374 fnet_bool_t fnet_socket_addr_are_equal(const struct sockaddr *addr1, const struct sockaddr *addr2); 01375 01376 /***************************************************************************/ /*! 01377 * 01378 * @brief Determines, if socket address is unspecified. 01379 * 01380 * @param addr Socket address. 01381 * 01382 * @return This function returns: 01383 * - @c FNET_TRUE if the address is unspecified. 01384 * - @c FNET_FALSE if the address is specified. 01385 * 01386 ****************************************************************************** 01387 * 01388 * This function determines if the socket address is unspecified 01389 * (IP address is set to all zeros) or not. 01390 * 01391 ******************************************************************************/ 01392 fnet_bool_t fnet_socket_addr_is_unspecified(const struct sockaddr *addr); 01393 01394 /***************************************************************************/ /*! 01395 * 01396 * @brief Determines, if socket address is multicast. 01397 * 01398 * @param addr Socket address. 01399 * 01400 * @return This function returns: 01401 * - @c FNET_TRUE if the address is multicast. 01402 * - @c FNET_FALSE if the address is not multicast. 01403 * 01404 ****************************************************************************** 01405 * 01406 * This function determines if the socket address is multicast or not. 01407 * 01408 ******************************************************************************/ 01409 fnet_bool_t fnet_socket_addr_is_multicast(const struct sockaddr *addr); 01410 01411 #if FNET_CFG_SOCKET_CALLBACK_ON_RX || defined(__DOXYGEN__) 01412 /***************************************************************************/ /*! 01413 * 01414 * @brief Registers the "Socket Rx" event handler callback. 01415 * 01416 * @param callback Pointer to the event-handler callback function. 01417 * 01418 ****************************************************************************** 01419 * 01420 * This function registers the @c handler callback function for 01421 * the "Socket Rx" event.@n 01422 * This event occurs when the socket layer receives any packet for any existing socket. 01423 * It can be a packet with or without data-payload including ACK, FIN and SYN.@n 01424 * For example, it can be used to wake-up a sleeping RTOS application waiting for a network activity. 01425 * To stop the event handling, set @c callback parameter to zero value. 01426 * 01427 ******************************************************************************/ 01428 void fnet_socket_set_callback_on_rx( void(*callback)(void)); 01429 #endif 01430 01431 /* BSD Socket API names */ 01432 #if FNET_CFG_SOCKET_BSD_NAMES 01433 #define socket fnet_socket 01434 #define bind fnet_socket_bind 01435 #define listen fnet_socket_listen 01436 #define accept fnet_socket_accept 01437 #define connect fnet_socket_connect 01438 #define recv fnet_socket_recv 01439 #define recvfrom fnet_socket_recvfrom 01440 #define send fnet_socket_send 01441 #define sendto fnet_socket_sendto 01442 #define shutdown fnet_socket_shutdown 01443 #define closesocket fnet_socket_close 01444 #define setsockopt fnet_socket_setopt 01445 #define getsockopt fnet_socket_getopt 01446 #define getpeername fnet_socket_getpeername 01447 #define getsockname fnet_socket_getname 01448 #endif 01449 01450 #if defined(__cplusplus) 01451 } 01452 #endif 01453 01454 /*! @} */ 01455 01456 #endif /* _FNET_SOCKET_H_ */
Generated on Tue Jul 12 2022 14:23:48 by
