18 #ifndef INCLUDE_UTIL_PLATFORM_OS_UNIX_BSDSOCKETS_HPP 19 #define INCLUDE_UTIL_PLATFORM_OS_UNIX_BSDSOCKETS_HPP 21 #if defined(sun) || defined(__sun) || defined(__sun__) 22 #define BSD_COMP // Needs to be defined in order to use FIONBIO in ioctl() 23 #define MSG_NOSIGNAL 0 // MSG_NOSIGNAL flag for send() not implemented on Solaris 26 #if defined(__MACH__) && defined(__APPLE__) 29 #ifndef _BSD_SOCKLEN_T_ 30 #define _BSD_SOCKLEN_T_ int32_t 33 #if defined( __GNUC__ ) && !defined(MSG_NOSIGNAL) 34 #define MSG_NOSIGNAL 0 37 #endif // defined(__MACH__) && defined(__APPLE__) 44 #include <sys/types.h> 45 #include <sys/socket.h> 46 #include <sys/ioctl.h> 47 #include <netinet/in.h> 48 #include <arpa/inet.h> 70 #ifndef INVALID_SOCKET 71 #define INVALID_SOCKET -1 76 #define INADDR_NONE ((unsigned long) -1) 83 inline std::string GetErrorString(
int err) {
return std::string( strerror(err) ); }
85 inline std::string GetErrorString() {
return GetErrorString( errno ); }
87 namespace BsdSockets {
89 typedef ::socklen_t socklen_t;
91 inline int recv(
int fd,
char *buf,
int len,
int flags)
93 return ::recv(fd, buf, len, flags);
96 inline int send(
int fd,
const char *buf,
int len,
int flags)
98 return ::send(fd, buf, len, flags | MSG_NOSIGNAL);
101 inline int sendto(
int fd,
const char *buf,
int len,
int flags,
const sockaddr *to,
int tolen)
103 return ::sendto(fd, buf, len, flags, to, tolen);
106 inline int recvfrom(
int fd,
char *buf,
int len,
int flags, sockaddr *from,
int *fromlen)
110 socklen_t fromlen_ = *fromlen;
111 int ret = ::recvfrom(fd, buf, len, flags, from, &fromlen_);
117 return ::recvfrom(fd, buf, len, flags, NULL, NULL);
121 inline int select(
int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
const struct timeval *timeout)
123 return ::select( nfds, readfds, writefds, exceptfds, const_cast<struct timeval *>(timeout) );
126 inline int accept(
int fd, sockaddr *addr,
int *addrlen)
128 socklen_t addrlen_ = *addrlen;
129 int ret = ::accept(fd, addr, &addrlen_);
134 inline int connect(
int fd,
const sockaddr *name,
int namelen)
136 return ::connect(fd, name, namelen);
139 inline int closesocket(
int fd)
144 inline void setblocking(SOCKET fd,
bool bBlocking)
146 int arg = bBlocking ? 0 : 1;
147 ::ioctl(fd, FIONBIO, &arg);
150 inline int GetLastError()
155 #if (defined(__MACH__) && defined(__APPLE__)) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__ANDROID__) 157 inline void disableBrokenPipeSignals()
159 signal(SIGPIPE, SIG_IGN);
164 inline void disableBrokenPipeSignals()
166 signal(SIGPIPE, SIG_IGN);
171 static const int ERR_EWOULDBLOCK = EWOULDBLOCK;
172 static const int ERR_EINPROGRESS = EINPROGRESS;
173 static const int ERR_ECONNRESET = ECONNRESET;
174 static const int ERR_ECONNABORTED = ECONNABORTED;
175 static const int ERR_ECONNREFUSED = ECONNREFUSED;
176 static const int ERR_EMSGSIZE = EMSGSIZE;
177 static const int ERR_EADDRINUSE = EADDRINUSE;