1 #ifndef __SOCKET_PORTABLE_H__
2 #define __SOCKET_PORTABLE_H__
7 const int BASIC_ERROR = -1;
9 #define SA_SIZEOF(addr) (((addr)->sa_family == AF_INET6) ? sizeof(sockaddr_in6) : sizeof(sockaddr_in))
11 #if defined(CPPPARSER)
14 typedef unsigned long SOCKET;
16 #include <sys/socket.h>
17 #include <netinet/in.h>
22 #elif defined(HP_SOCK)
24 #ifndef _INCLUDE_HPUX_SOURCE
25 #define _INCLUDE_HPUX_SOURCE
26 #define _INCLUDE_POSIX_SOURCE
27 #define _INCLUDE_XOPEN_SOURCE
29 #include <sys/socket.h>
31 #include <netinet/in.h>
35 #define socket_read read
36 #define socket_write write
37 #define socket_close close
39 #define DO_CONNECT(a,b,c) connect(a,b,c)
40 #define DO_SOCKET_READ(a,b,c,d) socket_read(a,b,c)
41 #define DO_SOCKET_WRITE(a,b,c,d) socket_write(a,b,c)
43 #define GETERROR() errno
46 #define SOCKIOCTL ioctl
47 typedef unsigned long SOCKET;
48 #define BAD_SOCKET 0xffffffff
58 typedef u_short sa_family_t;
60 inline int DO_SELECT(SOCKET n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout) {
61 return select((
int)n, readfds, writefds, exceptfds, timeout);
64 inline int DO_CONNECT(
const SOCKET a,
const struct sockaddr *b) {
65 return connect(a, b, SA_SIZEOF(b));
67 inline int DO_SOCKET_READ(
const SOCKET a,
char *buf,
const int size) {
68 return recv(a, buf, size, 0);
70 inline int DO_SOCKET_WRITE(
const SOCKET a,
const char *buff,
const int len) {
71 return send(a, buff, len, 0);
73 inline int DO_SOCKET_WRITE_TO(
const SOCKET a,
const char *buffer,
const int buf_len,
const sockaddr *addr) {
74 return sendto(a, buffer, buf_len, 0, addr, SA_SIZEOF(addr));
76 inline SOCKET DO_NEWUDP(sa_family_t family) {
77 return socket(family, SOCK_DGRAM, 0);
79 inline SOCKET DO_NEWTCP(sa_family_t family) {
80 return socket(family, SOCK_STREAM, 0);
82 inline int DO_BIND(
const SOCKET a,
const sockaddr *b) {
83 return ::bind(a, b, SA_SIZEOF(b));
85 inline int DO_CLOSE(
const SOCKET a) {
86 return closesocket(a);
88 inline SOCKET DO_ACCEPT(SOCKET sck, sockaddr *addr) {
89 socklen_t addrlen =
sizeof(sockaddr_storage);
90 return accept(sck, addr, &addrlen);
92 inline int DO_RECV_FROM(SOCKET sck,
char *data,
int len, sockaddr *addr) {
93 socklen_t plen =
sizeof(sockaddr_storage);
94 return recvfrom(sck, data, len, 0, addr, &plen);
96 inline int DO_LISTEN(
const SOCKET a,
const int size) {
97 return listen(a, size);
100 inline int GETERROR() {
101 return WSAGetLastError();
104 inline int SOCKIOCTL(
const SOCKET s,
const long flags,
unsigned long *val) {
105 return ioctlsocket(s, flags, val);
108 inline int init_network() {
109 static struct WSAData mydata;
110 int answer = WSAStartup(0x0101, &mydata);
118 inline bool do_shutdown_send(SOCKET s) {
119 return (shutdown(s, SD_SEND) == 0);
122 typedef int socklen_t;
123 const long LOCAL_NONBLOCK = 1;
124 const long LOCAL_FL_SET = FIONBIO;
125 const int LOCAL_BLOCKING_ERROR = WSAEWOULDBLOCK;
126 const int LOCAL_CONNECT_BLOCKING = WSAEWOULDBLOCK;
127 const int LOCAL_NOTCONNECTED_ERROR = WSAENOTCONN;
128 const int LOCAL_TIMEOUT_ERROR = WSAETIMEDOUT;
129 const SOCKET BAD_SOCKET = (SOCKET)-1;
134 #elif defined(SunOS) || defined(SUNNEW) || defined(IRIX64)
136 #include <sys/types.h>
137 #include <sys/time.h>
138 #include <sys/socket.h>
139 #include <sys/ioctl.h>
140 #include <sys/filio.h>
141 #include <netinet/in.h>
148 #include <netinet/in_systm.h>
149 #include <netinet/ip.h>
150 #include <netinet/in.h>
151 #include <arpa/inet.h>
154 const SOCKET BAD_SOCKET = 0xffffffff;
156 inline int DO_CONNECT(
const SOCKET a,
const sockaddr *b) {
157 return connect(a, b, SA_SIZEOF(b));
159 inline int DO_SOCKET_READ(
const SOCKET a,
char *buf,
const int size) {
160 return recv(a, buf, size, 0);
162 inline int DO_SOCKET_WRITE(
const SOCKET a,
const char *buff,
const int len) {
163 return send(a, buff, len, 0);
166 inline int DO_SOCKET_WRITE_TO(
const SOCKET a,
const char *buffer,
const int buf_len,
const sockaddr *addr) {
167 return sendto(a, buffer, buf_len, 0, addr, SA_SIZEOF(addr));
169 inline SOCKET DO_NEWUDP(sa_family_t family) {
170 return socket(family, SOCK_DGRAM, 0);
172 inline SOCKET DO_NEWTCP(sa_family_t family) {
173 return socket(family, SOCK_STREAM, 0);
175 inline int DO_BIND(
const SOCKET a,
const sockaddr *b) {
176 return ::bind(a, b, SA_SIZEOF(b));
178 inline int DO_CLOSE(
const SOCKET a) {
181 inline int DO_ACCEPT(SOCKET sck, sockaddr *addr) {
182 socklen_t addrlen =
sizeof(sockaddr_storage);
183 return accept(sck, (sockaddr *)addr, &addrlen);
186 inline int DO_RECV_FROM(SOCKET sck,
char *data,
int len, sockaddr *addr) {
187 socklen_t plen =
sizeof(sockaddr_storage);
188 return recvfrom(sck, data, len, 0, (sockaddr *)addr, &plen);
190 inline int DO_LISTEN(
const SOCKET a,
const int size) {
191 return listen(a, size);
194 inline int GETERROR() {
198 inline int SOCKIOCTL(
const SOCKET s,
const long flags,
void *val) {
199 return ioctl(s, flags, val);
202 inline int init_network() {
206 const INADDR_NONE = -1;
209 const long LOCAL_NONBLOCK = 1;
210 const long LOCAL_FL_SET = FIONBIO;
211 const int LOCAL_BLOCKING_ERROR = EAGAIN;
212 const int LOCAL_CONNECT_BLOCKING = EINPROGRESS;
218 #elif defined(IS_LINUX) || defined(IS_OSX) || defined(IS_FREEBSD)
220 #include <sys/types.h>
221 #include <sys/time.h>
222 #include <sys/socket.h>
223 #include <sys/ioctl.h>
224 #include <netinet/in.h>
232 #include <netinet/tcp.h>
234 #include <netinet/in.h>
235 #include <arpa/inet.h>
239 const SOCKET BAD_SOCKET = -1;
240 inline int DO_SELECT(SOCKET n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout) {
241 return select((
int)n, readfds, writefds, exceptfds, timeout);
244 inline int DO_CONNECT(
const SOCKET a,
const sockaddr *b) {
245 return connect(a, b, SA_SIZEOF(b));
247 inline int DO_SOCKET_READ(
const SOCKET a,
char *buf,
const int size) {
248 return (
int)recv(a, buf, (
size_t)size, 0);
250 inline int DO_SOCKET_WRITE(
const SOCKET a,
const char *buff,
const int len) {
251 return (
int)send(a, buff, (
size_t)len, 0);
253 inline int DO_SOCKET_WRITE_TO(
const SOCKET a,
const char *buffer,
const int buf_len,
const sockaddr *addr) {
254 return (
int)sendto(a, buffer, (
size_t)buf_len, 0, addr, SA_SIZEOF(addr));
256 inline SOCKET DO_NEWUDP(sa_family_t family) {
257 return socket(family, SOCK_DGRAM, 0);
259 inline SOCKET DO_NEWTCP(sa_family_t family) {
260 return socket(family, SOCK_STREAM, 0);
262 inline int DO_BIND(
const SOCKET a,
const sockaddr *b) {
263 return ::bind(a, b, SA_SIZEOF(b));
265 inline int DO_CLOSE(
const SOCKET a) {
269 inline int DO_ACCEPT(SOCKET sck, sockaddr *addr) {
270 socklen_t addrlen =
sizeof(sockaddr_storage);
271 return accept(sck, (sockaddr *)addr, &addrlen);
274 inline int DO_RECV_FROM(SOCKET sck,
char *data,
int len, sockaddr *addr) {
275 socklen_t plen =
sizeof(sockaddr_storage);
276 return (
int)recvfrom(sck, data, (
size_t)len, 0, (sockaddr *)addr, &plen);
280 inline int init_network() {
281 signal(SIGPIPE, SIG_IGN);
285 inline int DO_LISTEN(
const SOCKET a,
const int size) {
286 return listen(a, size);
289 inline int GETERROR() {
293 inline int SOCKIOCTL(
const SOCKET s,
const long flags,
void *val) {
294 return ioctl(s, (
unsigned long)flags, val);
297 inline bool do_shutdown_send(SOCKET s) {
298 return (shutdown(s, SHUT_WR) == 0);
304 const long LOCAL_NONBLOCK = 1;
307 const int LOCAL_BLOCKING_ERROR = EAGAIN;
308 const int LOCAL_CONNECT_BLOCKING = EINPROGRESS;
314 No Host Type defined !!