Webserver+3d print

Dependents:   Nucleo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bsd_socket.h Source File

bsd_socket.h

Go to the documentation of this file.
00001 /**
00002  * @file bsd_socket.h
00003  * @brief BSD socket API
00004  *
00005  * @section License
00006  *
00007  * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved.
00008  *
00009  * This file is part of CycloneTCP Open.
00010  *
00011  * This program is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU General Public License
00013  * as published by the Free Software Foundation; either version 2
00014  * of the License, or (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software Foundation,
00023  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00024  *
00025  * @author Oryx Embedded SARL (www.oryx-embedded.com)
00026  * @version 1.7.6
00027  **/
00028 
00029 #ifndef _BSD_SOCKET_H
00030 #define _BSD_SOCKET_H
00031 
00032 //BSD socket support
00033 #ifndef BSD_SOCKET_SUPPORT
00034    #define BSD_SOCKET_SUPPORT ENABLED
00035 #elif (BSD_SOCKET_SUPPORT != ENABLED && BSD_SOCKET_SUPPORT != DISABLED)
00036    #error BSD_SOCKET_SUPPORT parameter is not valid
00037 #endif
00038 
00039 //Keil RTX port?
00040 #if defined(USE_RTX) && !defined(RTX_CUSTOM_HEADER)
00041 
00042 //No support for BSD sockets
00043 #undef BSD_SOCKET_SUPPORT
00044 #define BSD_SOCKET_SUPPORT DISABLED
00045 
00046 //Windows port?
00047 #elif defined(_WIN32) && !defined(_DONT_USE_WINSOCK)
00048 
00049 //Undefine conflicting definitions
00050 #undef htons
00051 #undef htonl
00052 #undef ntohs
00053 #undef ntohl
00054 
00055 //Dependencies
00056 #include <winsock2.h>
00057 
00058 #else
00059 
00060 //Dependencies
00061 #include "os_port.h"
00062 
00063 //Address families
00064 #define AF_INET          2
00065 #define AF_INET6         10
00066 #define AF_PACKET        17
00067 
00068 //Socket types
00069 #define SOCK_STREAM      1
00070 #define SOCK_DGRAM       2
00071 #define SOCK_RAW         3
00072 
00073 //IP protocol identifiers
00074 #define IPPROTO_ICMP     1
00075 #define IPPROTO_IGMP     2
00076 #define IPPROTO_TCP      6
00077 #define IPPROTO_UDP      17
00078 #define IPPROTO_ICMPV6   58
00079 
00080 //Ethernet protocol identifiers
00081 #define ETH_P_ALL        0x0000
00082 #define ETH_P_IP         0x0800
00083 #define ETH_P_ARP        0x0806
00084 #define ETH_P_IPV6       0x86DD
00085 
00086 //Option levels
00087 #define SOL_SOCKET       0xFFFF
00088 
00089 //Common addresses
00090 #define INADDR_ANY       0x00000000
00091 #define INADDR_LOOPBACK  0x7F000001
00092 #define INADDR_BROADCAST 0xFFFFFFFF
00093 
00094 //Flags used by I/O functions
00095 #define MSG_PEEK         0x02
00096 #define MSG_DONTROUTE    0x04
00097 #define MSG_WAITALL      0x08
00098 #define MSG_DONTWAIT     0x01
00099 
00100 //Flags used by shutdown function
00101 #define SD_RECEIVE       0
00102 #define SD_SEND          1
00103 #define SD_BOTH          2
00104 
00105 //Socket level options
00106 #define SO_REUSEADDR     0x0004
00107 #define SO_KEEPALIVE     0x0008
00108 #define SO_DONTROUTE     0x0010
00109 #define SO_BROADCAST     0x0020
00110 #define SO_LINGER        0x0080
00111 #define SO_SNDBUF        0x1001
00112 #define SO_RCVBUF        0x1002
00113 #define SO_SNDTIMEO      0x1005
00114 #define SO_RCVTIMEO      0x1006
00115 #define SO_ERROR         0x1007
00116 #define SO_TYPE          0x1008
00117 #define SO_MAX_MSG_SIZE  0x2003
00118 #define SO_BINDTODEVICE  0x3000
00119 
00120 //TCP level options
00121 #define TCP_NODELAY      0x0001
00122 
00123 //IOCTL commands
00124 #define FIONREAD         0x400466FF
00125 #define FIONBIO          0x800466FE
00126 
00127 //FCNTL commands
00128 #define F_GETFL          3
00129 #define F_SETFL          4
00130 
00131 //FCNTL  flags
00132 #define O_NONBLOCK       0x0004
00133 
00134 //Status codes
00135 #define SOCKET_SUCCESS 0
00136 #define SOCKET_ERROR (-1)
00137 
00138 //Error codes
00139 #define EAGAIN       11
00140 #define EWOULDBLOCK  11
00141 #define EFAULT       14
00142 #define EINVAL       22
00143 #define ENOPROTOOPT  92
00144 #define ECONNRESET   104
00145 #define EISCONN      106
00146 #define ENOTCONN     107
00147 #define ESHUTDOWN    108
00148 #define ECONNREFUSED 111
00149 
00150 //Return codes
00151 #define INADDR_NONE ((in_addr_t) (-1))
00152 
00153 //Macros for manipulating and checking descriptor sets
00154 #define FD_SETSIZE 8
00155 #define FD_ZERO(fds) selectFdZero(fds)
00156 #define FD_SET(s, fds) selectFdSet(fds, s)
00157 #define FD_CLR(s, fds) selectFdClr(fds, s)
00158 #define FD_ISSET(s, fds) selectFdIsSet(fds, s)
00159 
00160 
00161 /**
00162  * @brief Length type
00163  **/
00164 
00165 typedef int_t socklen_t;
00166 
00167 
00168 /**
00169  * @brief IPv4 address
00170  **/
00171 
00172 typedef  uint32_t in_addr_t;
00173 
00174 
00175 /**
00176  * @brief Socket address
00177  **/
00178 
00179 typedef struct sockaddr
00180 {
00181    uint16_t sa_family;
00182    uint8_t sa_data[14];
00183 } sockaddr;
00184 
00185 
00186 /**
00187  * @brief Structure that represents an IPv4 address
00188  **/
00189 
00190 typedef struct in_addr
00191 {
00192    in_addr_t s_addr;
00193 } in_addr;
00194 
00195 
00196 /**
00197  * @brief IPv4 address information
00198  **/
00199 
00200 typedef struct sockaddr_in
00201 {
00202    uint16_t sin_family;
00203    uint16_t sin_port;
00204    in_addr sin_addr;
00205    uint8_t sin_zero[8];
00206 } sockaddr_in;
00207 
00208 
00209 /**
00210  * @brief Structure that represents an IPv6 address
00211  **/
00212 
00213 typedef struct in6_addr
00214 {
00215    uint8_t s6_addr[16];
00216 } in6_addr;
00217 
00218 
00219 /**
00220  * @brief IPv6 address information
00221  **/
00222 
00223 typedef struct sockaddr_in6
00224 {
00225    uint16_t sin6_family;
00226    uint16_t sin6_port;
00227    in6_addr sin6_addr;
00228 } sockaddr_in6;
00229 
00230 
00231 /**
00232  * @brief Set of sockets
00233  **/
00234 
00235 typedef struct fd_set
00236 {
00237   int_t fd_count;
00238   int_t fd_array[FD_SETSIZE];
00239 } fd_set;
00240 
00241 
00242 /**
00243  * @brief Timeout structure
00244  **/
00245 
00246 typedef struct timeval
00247 {
00248    uint32_t tv_sec;
00249    uint32_t tv_usec;
00250 } timeval;
00251 
00252 
00253 /**
00254  * @brief Information about a given host
00255  **/
00256 
00257 typedef struct hostent
00258 {
00259    uint16_t h_addrtype;
00260    uint16_t h_length;
00261    uint8_t h_addr[16];
00262 } hostent;
00263 
00264 
00265 //BSD socket related constants
00266 extern const in6_addr in6addr_any;
00267 extern const in6_addr in6addr_loopback;
00268 
00269 //BSD socket API
00270 int_t socket(int_t family, int_t type, int_t protocol);
00271 int_t bind(int_t s, const sockaddr *addr, socklen_t addrlen);
00272 int_t connect(int_t s, const sockaddr *addr, socklen_t addrlen);
00273 int_t listen(int_t s, int_t backlog);
00274 int_t accept(int_t s, sockaddr *addr, socklen_t *addrlen);
00275 int_t send(int_t s, const void *data, size_t length, int_t flags);
00276 
00277 int_t sendto(int_t s, const void *data, size_t length,
00278    int_t flags, const sockaddr *addr, socklen_t addrlen);
00279 
00280 int_t recv(int_t s, void *data, size_t size, int_t flags);
00281 
00282 int_t recvfrom(int_t s, void *data, size_t size,
00283    int_t flags, sockaddr *addr, socklen_t *addrlen);
00284 
00285 int_t getsockname(int_t s, sockaddr *addr, socklen_t *addrlen);
00286 int_t getpeername(int_t s, sockaddr *addr, socklen_t *addrlen);
00287 
00288 int_t setsockopt(int_t s, int_t level, int_t optname,
00289    const void *optval, socklen_t optlen);
00290 
00291 int_t getsockopt(int_t s, int_t level, int_t optname,
00292    void *optval, socklen_t *optlen);
00293 
00294 int_t ioctlsocket(int_t s, uint32_t cmd, void *arg);
00295 int_t fcntl(int_t s, int_t cmd, void *arg);
00296 
00297 int_t shutdown(int_t s, int_t how);
00298 int_t closesocket(int_t s);
00299 
00300 int_t select(int_t nfds, fd_set *readfds, fd_set *writefds,
00301    fd_set *exceptfds, const timeval *timeout);
00302 
00303 void selectFdZero(fd_set *fds);
00304 void selectFdSet(fd_set *fds, int_t s);
00305 void selectFdClr(fd_set *fds, int_t s);
00306 int_t selectFdIsSet(fd_set *fds, int_t s);
00307 
00308 int_t gethostbyname(const char_t *name, hostent *info);
00309 
00310 in_addr_t inet_addr(const char_t *cp);
00311 
00312 int_t inet_aton(const char_t *cp, in_addr *inp);
00313 const char_t *inet_ntoa(in_addr in, char_t *cp);
00314 
00315 int_t inet_pton(int_t af, const char_t *src, void *dst);
00316 const char_t *inet_ntop(int_t af, const void *src, char_t *dst, socklen_t size);
00317 
00318 #endif
00319 
00320 #endif
00321