sockio.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:8k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _SOCKIO_H_
  36. #define _SOCKIO_H_
  37. class TCPIO;
  38. #ifdef _WIN16
  39. #include <memory.h>
  40. #include <winsock.h>
  41. #elif defined _WIN32
  42. #if defined USE_WINSOCK1
  43. #include <winsock.h>
  44. #else
  45. #include <winsock2.h>
  46. #endif //USE_WINSOCK1
  47. #endif
  48. #include "hlxclib/fcntl.h"
  49. #ifndef WIN32_PLATFORM_PSPC
  50. #include "asyncio.h"
  51. #endif
  52. #include "hlxclib/sys/types.h"
  53. #include "hxassert.h"
  54. #define EWOULDBLOCK WSAEWOULDBLOCK
  55. #define EINPROGRESS WSAEINPROGRESS
  56. struct iovec {
  57.     char* iov_base;
  58.     size_t iov_len;
  59. };
  60. typedef struct iovec HX_IOVEC;
  61. #define MAX_IOVECTORS 1000
  62. int inet_aton(register const char *cp, struct in_addr* addr);
  63. class SocketIO 
  64. #ifndef WIN32_PLATFORM_PSPC
  65. : public AsyncIO
  66. #endif
  67. {
  68. public:
  69.     friend class TCPIO;
  70.     friend class UDPIO;
  71. SocketIO::SocketIO();
  72.     virtual      SocketIO::~SocketIO();
  73.     static INT32 create_address(struct sockaddr_in& addr, char* host,
  74.        INT16 port);
  75.     INT32               init(INT32 type, BOOL do_block=TRUE,
  76.                                 BOOL reuse_addr=TRUE, BOOL reuse_port=FALSE);
  77.     INT32 init(INT32 type, UINT32 local_addr, INT16 port,
  78.              BOOL do_block=TRUE, 
  79.          BOOL reuse_addr=TRUE, BOOL reuse_port=FALSE);
  80.     INT32 listen(INT32 backlog);
  81.     INT32 connect(char* host, INT16 port);
  82.     INT32 connect(sockaddr_in *addr);
  83.     TCPIO* accept(sockaddr_in *addr, INT32* addrlen);
  84.     INT32 bind(sockaddr_in*);
  85.     INT32 blocking();
  86.     INT32 nonblocking();
  87.     INT32 getsockname(sockaddr_in* addr, INT32* addr_len);
  88.     INT32 close();
  89.     INT32 read(void* buf, INT32 size);
  90.     INT32 write(const void* buf, INT32 size);
  91.     off_t seek(off_t off, INT32 whence);
  92.     INT16 port();
  93.     INT32 disable();
  94.     INT32 reuse_port(BOOL enable);
  95.     INT32 reuse_addr(BOOL enable);
  96.     INT32 error();
  97.     INT32 flags();
  98.     virtual SOCKET socket();
  99.     off_t file_size();
  100.     static const UINT32 MAX_HOSTNAME_LEN;
  101.     static int gethostname(char* name, int count);
  102. protected:
  103. SocketIO::SocketIO(SOCKET conn);
  104.     INT32 err;
  105.     SOCKET sock;
  106.     INT32 _flags;
  107. };
  108. inline
  109. SocketIO::SocketIO()
  110. {
  111.     err = 0;
  112.     _flags = O_RDWR;
  113.     sock = INVALID_SOCKET;
  114. }
  115. inline
  116. SocketIO::SocketIO(SOCKET conn)
  117. {
  118.     err = 0;
  119.     _flags = O_RDWR;
  120.     sock = conn;
  121. }
  122. inline INT32
  123. SocketIO::error()
  124. {
  125.     return err;
  126. }
  127. inline INT32
  128. SocketIO::flags()
  129. {
  130.     return _flags;
  131. }
  132. inline INT32
  133. SocketIO::disable()
  134. {
  135.     sock = INVALID_SOCKET;
  136.     return 0;
  137. }
  138. inline INT32
  139. SocketIO::close() 
  140. {
  141.     if (sock < 0)
  142.     {
  143. return 0;
  144.     }
  145.     INT32 ret = ::closesocket(sock);
  146.     sock = INVALID_SOCKET;
  147.     if (ret < 0)
  148. err = WSAGetLastError();
  149.     return ret;
  150. }
  151. inline
  152. SocketIO::~SocketIO() 
  153. {
  154.     close();
  155. }
  156. inline INT32
  157. SocketIO::blocking() 
  158. {
  159.     u_long dont_block = 0;
  160.     INT32 ret = ::ioctlsocket(sock, FIONBIO, &dont_block);
  161.     if (ret < 0)
  162. err = WSAGetLastError();
  163.     return ret;
  164. }
  165. inline INT32
  166. SocketIO::nonblocking() 
  167. {
  168.     u_long dont_block = 1;
  169.     INT32 ret = ::ioctlsocket(sock, FIONBIO, &dont_block);
  170.     if (ret < 0)
  171. err = WSAGetLastError();
  172.     return ret;
  173. }
  174. inline INT32
  175. SocketIO::getsockname(sockaddr_in* addr, INT32* addr_len)
  176. {
  177.     if (sock < 0)
  178.     {
  179. err = WSAEBADF;
  180. return -1;
  181.     }
  182.     int temp_addr = HX_SAFEINT(*addr_len);
  183.     int ret = ::getsockname(sock,(sockaddr*) addr, &temp_addr);
  184.     *addr_len = temp_addr;
  185.     if (ret < 0)
  186. err = WSAGetLastError();
  187.     return ret;
  188. }
  189. inline INT32
  190. SocketIO::listen(INT32 backlog) 
  191. {
  192.     if (sock < 0)
  193.     {
  194. err = WSAEBADF;
  195. return -1;
  196.     }
  197.     INT32 ret = ::listen(sock, HX_SAFEINT(backlog));
  198.     if (ret < 0)
  199. err = WSAGetLastError();
  200.     return ret;
  201. }
  202. inline INT32
  203. SocketIO::bind(sockaddr_in* addr) 
  204. {
  205.     if (sock < 0)
  206.     {
  207. err = WSAEBADF;
  208. return -1;
  209.     }
  210.     INT32 ret = ::bind(sock, (sockaddr*)addr, sizeof *addr);
  211.     if (ret < 0)
  212. err = WSAGetLastError();
  213.     return ret;
  214. }
  215. inline INT32
  216. SocketIO::connect(sockaddr_in* addr) 
  217. {
  218.     if (sock < 0)
  219.     {
  220. err = WSAEBADF;
  221. return -1;
  222.     }
  223.     INT32 ret = ::connect(sock, (sockaddr*)addr, sizeof *addr);
  224.     if (ret < 0)
  225. err = WSAGetLastError();
  226.     return ret;
  227. }
  228. inline INT32
  229. SocketIO::read(void * buf, INT32 len) 
  230. {
  231.     if (sock < 0)
  232.     {
  233. err = WSAEBADF;
  234. return -1;
  235.     }
  236.     INT32 ret = ::recv(sock, (char *)buf, HX_SAFEINT(len), 0);
  237.     if (ret < 0)
  238. err = WSAGetLastError();
  239.     return ret;
  240. }
  241. inline INT32
  242. SocketIO::write(const void * buf, INT32 len) 
  243. {    
  244.     if (sock < 0)
  245.     {
  246. err = WSAEBADF;
  247. return -1;
  248.     }
  249.     INT32 ret = ::send(sock, (const char *)buf, HX_SAFEINT(len), 0);
  250.     if (ret < 0)
  251. err = WSAGetLastError();
  252. #if defined SOLARIS2_4
  253.     if (err == EINVAL)    /* This is a hack to get solaris 2.4 to work */
  254.     {
  255. err = 0;
  256. ret = 0;
  257.     }
  258. #endif
  259.     return ret;
  260. }
  261. inline INT16
  262. SocketIO::port()
  263. {
  264.     sockaddr_in addr;
  265.     INT32 addr_len = sizeof addr;
  266.     memset(&addr, 0, HX_SAFESIZE_T(addr_len));
  267.     INT32 ret = getsockname(&addr, &addr_len);
  268.     return (ret < 0) ? (INT16) ret : ntohs(addr.sin_port);
  269. }
  270. inline INT32
  271. SocketIO::reuse_port(BOOL enable)
  272. {
  273. #if defined SO_REUSEPORT
  274.     if (sock < 0)
  275.     {
  276. err = WSAEBADF;
  277. return -1;
  278.     }
  279.     INT32  ret;
  280.     int  opt_val = 0;
  281.     if (enable)
  282.     {
  283. opt_val = 1;
  284.     }
  285.     ret = ::setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char*) &opt_val,
  286.        sizeof (int));
  287.     if (ret < 0)
  288.     {
  289. err = WSAGetLastError();
  290.     }
  291.     return ret;
  292. #else
  293.     return 0;
  294. #endif
  295. }
  296. inline INT32
  297. SocketIO::reuse_addr(BOOL enable)
  298.     if (sock < 0)
  299.     {
  300. err = WSAEBADF;
  301. return -1;
  302.     }
  303.     INT32 ret;
  304.     int   opt_val = 0;
  305.     if (enable)
  306.     {
  307. opt_val = 1;
  308.     }
  309.     ret = ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &opt_val,
  310.        sizeof (int));
  311.     if (ret < 0)
  312.     {
  313. err = WSAGetLastError();
  314.     }
  315.     return ret;
  316. }
  317. inline off_t
  318. SocketIO::seek(off_t off, INT32 whence)
  319. {
  320.     ASSERT(FALSE);
  321.     return -1;
  322. }
  323. inline int
  324. SocketIO::gethostname(char* name, int count)
  325. {
  326.     int result;
  327.     result = ::gethostname(name, count);
  328.     if (result < 0)
  329.     {
  330. return WSAGetLastError();
  331.     }
  332.     return 0;
  333. }
  334. inline off_t
  335. SocketIO::file_size()
  336. {
  337.     ASSERT(0);
  338.     return -1;
  339. }
  340. inline SOCKET
  341. SocketIO::socket()
  342. {
  343.     return sock;
  344. }
  345. #endif /* _SOCKIO_H_ */