socket_portable.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #ifndef __SOCKET_PORTABLE_H__
  2. #define __SOCKET_PORTABLE_H__
  3. //////////////////////////////////////////////////////////////////
  4. // Lots of stuff to make network socket-based io transparent across multiple
  5. // platforms
  6. //////////////////////////////////////////////////////////////////
  7. const int ALL_OK = 0;
  8. const int BASIC_ERROR = -1;
  9. #if defined(CPPPARSER)
  10. // Interrogate doesn't need to parse any of this.
  11. typedef unsigned long SOCKET;
  12. /************************************************************************
  13. * HP SOCKET LIBRARY STUFF
  14. ************************************************************************/
  15. #elif defined(HP_SOCK)
  16. #ifndef _INCLUDE_HPUX_SOURCE
  17. #define _INCLUDE_HPUX_SOURCE
  18. #define _INCLUDE_POSIX_SOURCE
  19. #define _INCLUDE_XOPEN_SOURCE
  20. #endif
  21. #include <sys/socket.h>
  22. #include <sys/time.h>
  23. #include <netinet/in.h>
  24. #include <netdb.h>
  25. #include <errno.h>
  26. #define socket_read read
  27. #define socket_write write
  28. #define socket_close close
  29. #define DO_CONNECT(a,b,c) connect(a,b,c)
  30. #define DO_SOCKET_READ(a,b,c,d) socket_read(a,b,c)
  31. #define DO_SOCKET_WRITE(a,b,c,d) socket_write(a,b,c)
  32. #define GETERROR() errno
  33. #define SOCKIOCTL ioctl
  34. typedef unsigned long SOCKET;
  35. #define BAD_SOCKET 0xffffffff
  36. /************************************************************************
  37. * WINSOCK 32 bit STUFF
  38. ************************************************************************/
  39. #elif defined(WIN32) || defined(WIN32_VC) || defined(WIN64_VC)
  40. #include <winsock2.h>
  41. #include <Ws2tcpip.h>
  42. inline int DO_SELECT(SOCKET n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout)
  43. {
  44. return select((int) n, readfds, writefds, exceptfds,timeout);
  45. }
  46. inline int DO_CONNECT( const SOCKET a, const struct sockaddr_in *b)
  47. {
  48. return connect(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  49. }
  50. inline int DO_SOCKET_READ(const SOCKET a, char * buf, const int size)
  51. {
  52. return recv(a, buf, size, 0);
  53. }
  54. inline int DO_SOCKET_WRITE(const SOCKET a, const char * buff, const int len)
  55. {
  56. return send(a, buff, len, 0);
  57. }
  58. inline int DO_SOCKET_WRITE_TO(const SOCKET a, const char * buffer, const int buf_len, const sockaddr_in * addr)
  59. {
  60. return sendto(a, buffer, buf_len, 0, reinterpret_cast<const struct ::sockaddr *>(addr), sizeof(sockaddr));
  61. }
  62. inline SOCKET DO_NEWUDP()
  63. {
  64. return socket(AF_INET, SOCK_DGRAM, 0);
  65. }
  66. inline SOCKET DO_NEWTCP()
  67. {
  68. return socket(AF_INET, SOCK_STREAM, 0);
  69. }
  70. inline int DO_BIND(const SOCKET a, const sockaddr_in *b)
  71. {
  72. return ::bind(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  73. }
  74. inline int DO_CLOSE(const SOCKET a)
  75. {
  76. return closesocket(a);
  77. }
  78. inline SOCKET DO_ACCEPT(SOCKET sck, sockaddr_in * adr)
  79. {
  80. int adrlen = sizeof(sockaddr);
  81. return accept(sck, reinterpret_cast<sockaddr *>(adr), &adrlen);
  82. };
  83. inline int DO_RECV_FROM(SOCKET sck, char * data, int len, sockaddr_in * addr)
  84. {
  85. int plen = sizeof(sockaddr);
  86. return recvfrom(sck, data, len, 0, reinterpret_cast<sockaddr *>(addr), &plen);
  87. }
  88. inline int DO_LISTEN(const SOCKET a, const int size)
  89. {
  90. return listen(a, size);
  91. }
  92. inline int GETERROR()
  93. {
  94. return WSAGetLastError();
  95. }
  96. inline int SOCKIOCTL(const SOCKET s, const long flags, unsigned long * val)
  97. {
  98. return ioctlsocket(s, flags, val);
  99. }
  100. inline int init_network()
  101. {
  102. static struct WSAData mydata;
  103. int answer = WSAStartup(0x0101, &mydata);
  104. if (answer != 0)
  105. return BASIC_ERROR;
  106. return ALL_OK;
  107. }
  108. inline bool do_shutdown_send(SOCKET s)
  109. {
  110. return (shutdown(s,SD_SEND) == 0);
  111. };
  112. typedef int socklen_t ;
  113. const long LOCAL_NONBLOCK = 1;
  114. const long LOCAL_FL_SET = FIONBIO ;
  115. const int LOCAL_BLOCKING_ERROR = WSAEWOULDBLOCK;
  116. const int LOCAL_CONNECT_BLOCKING = WSAEWOULDBLOCK;
  117. const int LOCAL_NOTCONNECTED_ERROR = WSAENOTCONN;
  118. const int LOCAL_TIMEOUT_ERROR = WSAETIMEDOUT;
  119. const SOCKET BAD_SOCKET = (SOCKET)-1;
  120. /************************************************************************
  121. * Solaris 2.6 and Irix 6.4 STUFF
  122. ************************************************************************/
  123. #elif defined(SunOS) || defined(SUNNEW) || defined(IRIX64)
  124. #include <sys/types.h>
  125. #include <sys/time.h>
  126. #include <sys/socket.h>
  127. #include <sys/ioctl.h>
  128. #include <sys/filio.h>
  129. #include <netinet/in.h>
  130. #include <netdb.h>
  131. #include <errno.h>
  132. #include <fcntl.h>
  133. #include <signal.h>
  134. #include <unistd.h>
  135. #include <string.h>
  136. #include <netinet/in_systm.h>
  137. #include <netinet/ip.h>
  138. #include <netinet/in.h>
  139. #include <arpa/inet.h>
  140. typedef int SOCKET;
  141. const SOCKET BAD_SOCKET = 0xffffffff;
  142. //#define DO_CONNECT(a,b) connect(a,(sockaddr *)b,sizeof(sockaddr))
  143. //#define DO_SOCKET_READ(a,b,c) recv(a,b,c,0)
  144. //#define DO_SOCKET_WRITE(a,b,c) send(a,b,c,0)
  145. inline int DO_CONNECT(const SOCKET a, const sockaddr_in *b)
  146. {
  147. return connect(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  148. }
  149. inline int DO_SOCKET_READ(const SOCKET a, char * buf, const int size)
  150. {
  151. return recv(a, buf, size, 0);
  152. }
  153. inline int DO_SOCKET_WRITE(const SOCKET a, const char * buff, const int len)
  154. {
  155. return send(a, buff, len, 0);
  156. }
  157. //#define DO_SOCKET_WRITE_TO(a,b,c,d) sendto(a,b,c,0,(sockaddr *)d,sizeof(sockaddr))
  158. //#define DO_NEWUDP() socket(AF_INET, SOCK_DGRAM, 0)
  159. //#define DO_NEWTCP() socket(AF_INET, SOCK_STREAM, 0)
  160. //#define DO_BIND(a,b) ::bind(a,(sockaddr *)b,sizeof(sockaddr))
  161. //#/define DO_CLOSE(a) close(a)
  162. inline int DO_SOCKET_WRITE_TO(const SOCKET a, const char * buffer, const int buf_len, const sockaddr_in * addr)
  163. {
  164. return sendto(a, buffer, buf_len, 0, reinterpret_cast<const struct ::sockaddr *>(addr), sizeof(sockaddr));
  165. }
  166. inline SOCKET DO_NEWUDP()
  167. {
  168. return socket(AF_INET, SOCK_DGRAM, 0);
  169. }
  170. inline SOCKET DO_NEWTCP()
  171. {
  172. return socket(AF_INET, SOCK_STREAM, 0);
  173. }
  174. inline int DO_BIND(const SOCKET a, const sockaddr_in *b)
  175. {
  176. return ::bind(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  177. }
  178. inline int DO_CLOSE(const SOCKET a)
  179. {
  180. return close(a);
  181. }
  182. inline int DO_ACCEPT(SOCKET sck, sockaddr_in * adr)
  183. {
  184. int adrlen = sizeof(sockaddr);
  185. return accept(sck, ( sockaddr *)adr, &adrlen);
  186. };
  187. inline int DO_RECV_FROM(SOCKET sck, char * data, int len, sockaddr_in * addr)
  188. {
  189. int plen = sizeof(sockaddr);
  190. return recvfrom(sck, data, len, 0, (sockaddr *)addr, &plen);
  191. }
  192. inline int DO_LISTEN(const SOCKET a, const int size)
  193. {
  194. return listen(a, size);
  195. }
  196. inline int GETERROR()
  197. {
  198. return errno;
  199. }
  200. inline int SOCKIOCTL(const SOCKET s, const long flags, void * val)
  201. {
  202. return ioctl(s, flags, val);
  203. }
  204. inline int init_network()
  205. {
  206. return ALL_OK;
  207. }
  208. #ifndef INADDR_NONE
  209. const INADDR_NONE = -1;
  210. #endif
  211. const long LOCAL_NONBLOCK = 1;
  212. const long LOCAL_FL_SET = FIONBIO ;
  213. const int LOCAL_BLOCKING_ERROR = EAGAIN;
  214. const int LOCAL_CONNECT_BLOCKING = EINPROGRESS;
  215. /************************************************************************
  216. * LINUX and FreeBSD STUFF
  217. ************************************************************************/
  218. #elif defined(IS_LINUX) || defined(IS_OSX) || defined(IS_FREEBSD)
  219. #include <sys/types.h>
  220. #include <sys/time.h>
  221. #include <sys/socket.h>
  222. #include <sys/ioctl.h>
  223. #include <netinet/in.h>
  224. #include <netdb.h>
  225. #include <errno.h>
  226. #include <fcntl.h>
  227. #include <signal.h>
  228. #include <unistd.h>
  229. #include <stdio.h>
  230. //#include <netinet/in_systm.h>
  231. #include <netinet/tcp.h>
  232. //#include <netinet/ip.h>
  233. #include <netinet/in.h>
  234. #include <arpa/inet.h>
  235. #include <unistd.h>
  236. typedef struct sockaddr_in AddressType;
  237. typedef int SOCKET;
  238. const SOCKET BAD_SOCKET = -1;
  239. inline int DO_SELECT(SOCKET n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout)
  240. {
  241. return select((int) n, readfds, writefds, exceptfds,timeout);
  242. }
  243. inline int DO_CONNECT(const SOCKET a, const sockaddr_in *b)
  244. {
  245. return connect(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  246. }
  247. inline int DO_SOCKET_READ(const SOCKET a, char * buf, const int size)
  248. {
  249. return (int)recv(a, buf, (size_t)size, 0);
  250. }
  251. inline int DO_SOCKET_WRITE(const SOCKET a, const char * buff, const int len)
  252. {
  253. return (int)send(a, buff, (size_t)len, 0);
  254. }
  255. ///////////////////////////////////////////////
  256. inline int DO_SOCKET_WRITE_TO(const SOCKET a, const char * buffer, const int buf_len, const sockaddr_in * addr)
  257. {
  258. return (int)sendto(a, buffer, (size_t)buf_len, 0, reinterpret_cast<const struct ::sockaddr *>(addr), sizeof(sockaddr));
  259. }
  260. inline SOCKET DO_NEWUDP()
  261. {
  262. return socket(AF_INET, SOCK_DGRAM, 0);
  263. }
  264. inline SOCKET DO_NEWTCP()
  265. {
  266. return socket(AF_INET, SOCK_STREAM, 0);
  267. }
  268. inline int DO_BIND(const SOCKET a, const sockaddr_in *b)
  269. {
  270. return ::bind(a, reinterpret_cast<const struct ::sockaddr *>(b), sizeof(sockaddr));
  271. }
  272. inline int DO_CLOSE(const SOCKET a)
  273. {
  274. return close(a);
  275. }
  276. inline int DO_ACCEPT(SOCKET sck, sockaddr_in * adr)
  277. {
  278. socklen_t adrlen = sizeof(sockaddr);
  279. return accept(sck, ( sockaddr *)adr, &adrlen);
  280. };
  281. inline int DO_RECV_FROM(SOCKET sck, char * data, int len, sockaddr_in * addr)
  282. {
  283. socklen_t plen = sizeof(sockaddr);
  284. return (int)recvfrom(sck, data, (size_t)len, 0, (sockaddr *)addr, &plen);
  285. }
  286. inline int init_network()
  287. {
  288. signal(SIGPIPE, SIG_IGN); // hmm do i still need this ...
  289. return ALL_OK;
  290. }
  291. inline int DO_LISTEN(const SOCKET a, const int size)
  292. {
  293. return listen(a, size);
  294. }
  295. inline int GETERROR()
  296. {
  297. return errno;
  298. }
  299. inline int SOCKIOCTL(const SOCKET s, const long flags, void * val)
  300. {
  301. return ioctl(s, (unsigned long)flags, val);
  302. }
  303. inline bool do_shutdown_send(SOCKET s)
  304. {
  305. return (shutdown(s,SHUT_WR) == 0);
  306. };
  307. #define BSDBLOCK
  308. const long LOCAL_NONBLOCK = 1;
  309. // With BSDBLOCK defined, we don't need FIONBIO. Solaris doesn't provide it.
  310. //const long LOCAL_FL_SET = FIONBIO ;
  311. const int LOCAL_BLOCKING_ERROR = EAGAIN;
  312. const int LOCAL_CONNECT_BLOCKING = EINPROGRESS;
  313. #else
  314. /************************************************************************
  315. * NO DEFINITION => GIVE COMPILATION ERROR
  316. ************************************************************************/
  317. No Host Type defined !!
  318. #error Fatal
  319. #endif
  320. #endif //__SOCKET_PORTABLE_H__