AtxSockets.h

00001 /*****************************************************************
00002 |
00003 |   Atomix - Network Sockets 
00004 |
00005 |   (c) 2002-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00009 
00010 #ifndef _ATX_SOCKETS_H_
00011 #define _ATX_SOCKETS_H_
00012 
00013 /*----------------------------------------------------------------------
00014 |   includes
00015 +---------------------------------------------------------------------*/
00016 #include "AtxTypes.h"
00017 #include "AtxStreams.h"
00018 #include "AtxDataBuffer.h"
00019 
00020 /*----------------------------------------------------------------------
00021 |   types
00022 +---------------------------------------------------------------------*/
00023 typedef unsigned int ATX_IpPort;
00024 typedef unsigned char ATX_IpAddress[4];
00025 
00026 typedef struct {
00027     ATX_IpAddress ip_address;
00028     ATX_IpPort    port;
00029 } ATX_SocketAddress;
00030 
00031 typedef struct {
00032     ATX_SocketAddress local_address;
00033     ATX_SocketAddress remote_address;
00034 } ATX_SocketInfo;
00035 
00036 /*----------------------------------------------------------------------
00037 |   constants
00038 +---------------------------------------------------------------------*/
00039 #define ATX_SOCKET_TIMEOUT_INFINITE         -1
00040 
00041 #define ATX_ERROR_DISCONNECTED        (ATX_ERROR_BASE_SOCKETS - 0)
00042 #define ATX_ERROR_HOST_UNKNOWN        (ATX_ERROR_BASE_SOCKETS - 1)
00043 #define ATX_ERROR_SOCKET_FAILED       (ATX_ERROR_BASE_SOCKETS - 2)
00044 #define ATX_ERROR_CONNECTION_REFUSED  (ATX_ERROR_BASE_SOCKETS - 3)
00045 #define ATX_ERROR_CONNECTION_FAILED   (ATX_ERROR_BASE_SOCKETS - 4)
00046 #define ATX_ERROR_CONNECTION_RESET    (ATX_ERROR_BASE_SOCKETS - 5)
00047 #define ATX_ERROR_CONNECTION_ABORTED  (ATX_ERROR_BASE_SOCKETS - 6)
00048 #define ATX_ERROR_TIMEOUT             (ATX_ERROR_BASE_SOCKETS - 7)
00049 #define ATX_ERROR_BIND_FAILED         (ATX_ERROR_BASE_SOCKETS - 8)
00050 #define ATX_ERROR_LISTEN_FAILED       (ATX_ERROR_BASE_SOCKETS - 9)
00051 #define ATX_ERROR_ACCEPT_FAILED       (ATX_ERROR_BASE_SOCKETS - 10)
00052 #define ATX_ERROR_SELECT_FAILED       (ATX_ERROR_BASE_SOCKETS - 11)
00053 #define ATX_ERROR_ADDRESS_IN_USE      (ATX_ERROR_BASE_SOCKETS - 12)
00054 #define ATX_ERROR_NETWORK_DOWN        (ATX_ERROR_BASE_SOCKETS - 13)
00055 #define ATX_ERROR_NETWORK_UNREACHABLE (ATX_ERROR_BASE_SOCKETS - 14)
00056 #define ATX_ERROR_WOULD_BLOCK         (ATX_ERROR_BASE_SOCKETS - 15)
00057 
00058 /*----------------------------------------------------------------------
00059 |   functions
00060 +---------------------------------------------------------------------*/
00061 #ifdef __cplusplus
00062 extern "C" {
00063 #endif /* __cplusplus */
00064 
00065 void ATX_IpAddress_Reset(ATX_IpAddress* address);
00066 void ATX_IpAddress_SetFromLong(ATX_IpAddress* address,
00067                                unsigned long  long_addr);
00068 unsigned long ATX_IpAddress_AsLong(const ATX_IpAddress* address);
00069 ATX_Result ATX_IpAddress_Parse(ATX_IpAddress* address, ATX_CString name);
00070 ATX_Result ATX_IpAddress_ResolveName(ATX_IpAddress* address,
00071                                      ATX_CString    name, 
00072                                      ATX_Timeout    timeout);
00073 void ATX_IpAddress_Copy(ATX_IpAddress* address,
00074                         ATX_IpAddress* other);
00075 void ATX_SocketAddress_Reset(ATX_SocketAddress* address);
00076 void ATX_SocketAddress_Set(ATX_SocketAddress* address,
00077                            ATX_IpAddress*     ip_address,
00078                            ATX_IpPort         port);
00079 
00080 #ifdef __cplusplus
00081 }
00082 #endif /* __cplusplus */
00083 
00084 /*----------------------------------------------------------------------
00085 |   ATX_Socket
00086 +---------------------------------------------------------------------*/
00087 ATX_DECLARE_INTERFACE(ATX_Socket)
00088 ATX_BEGIN_INTERFACE_DEFINITION(ATX_Socket)
00089     ATX_Result (*Bind)(ATX_Socket*              self, 
00090                        const ATX_SocketAddress* address);
00091     ATX_Result (*Connect)(ATX_Socket*              self, 
00092                           const ATX_SocketAddress* address,
00093                           ATX_Timeout              timeout);
00094     ATX_Result (*GetInputStream)(ATX_Socket*         self, 
00095                                  ATX_InputStream**   stream);
00096     ATX_Result (*GetOutputStream)(ATX_Socket*         self, 
00097                                   ATX_OutputStream**  stream);
00098     ATX_Result (*GetInfo)(ATX_Socket*         self, 
00099                           ATX_SocketInfo*     info);
00100 ATX_END_INTERFACE_DEFINITION
00101 
00102 /*----------------------------------------------------------------------
00103 |   convenience macros
00104 +---------------------------------------------------------------------*/
00105 #define ATX_Socket_Bind(object, address) \
00106 ATX_INTERFACE(object)->Bind(object, address)
00107 
00108 #define ATX_Socket_Connect(object, address, timeout) \
00109 ATX_INTERFACE(object)->Connect(object, \
00110                                address,              \
00111                                timeout)
00112 
00113 #define ATX_Socket_GetInputStream(object, stream)\
00114 ATX_INTERFACE(object)->GetInputStream(object, stream)
00115 
00116 #define ATX_Socket_GetOutputStream(object, stream)\
00117 ATX_INTERFACE(object)->GetOutputStream(object, stream)
00118 
00119 #define ATX_Socket_GetInfo(object, info)\
00120 ATX_INTERFACE(object)->GetInfo(object, info)
00121 
00122 /*----------------------------------------------------------------------
00123 |   functions
00124 +---------------------------------------------------------------------*/
00125 #ifdef __cplusplus
00126 extern "C" {
00127 #endif /* __cplusplus */
00128 
00129 ATX_Result ATX_Socket_ConnectToHost(ATX_Socket* self,
00130                                     ATX_CString host,
00131                                     ATX_IpPort  port,
00132                                     ATX_Timeout timeout);
00133 #ifdef __cplusplus
00134 }
00135 #endif /* __cplusplus */
00136 
00137 
00138 /*----------------------------------------------------------------------
00139 |   ATX_DatagramSocket
00140 +---------------------------------------------------------------------*/
00141 ATX_DECLARE_INTERFACE(ATX_DatagramSocket)
00142 ATX_BEGIN_INTERFACE_DEFINITION(ATX_DatagramSocket)
00143     ATX_Result (*Send)(ATX_DatagramSocket*         self,
00144                        const ATX_DataBuffer*       packet, 
00145                        const ATX_SocketAddress*    address);
00146     ATX_Result (*Receive)(ATX_DatagramSocket*         self,
00147                           ATX_DataBuffer*             packet, 
00148                           ATX_SocketAddress*          address);
00149 ATX_END_INTERFACE_DEFINITION
00150 
00151 /*----------------------------------------------------------------------
00152 |   convenience macros
00153 +---------------------------------------------------------------------*/
00154 #define ATX_ServerSocket_Send(object, packet, address) \
00155 ATX_INTERFACE(object)->Send(object, packet, address)
00156 
00157 #define ATX_ServerSocket_Receive(object, packet, address) \
00158 ATX_INTERFACE(object)->Receive(object, packet, address)
00159 
00160 /*----------------------------------------------------------------------
00161 |   ATX_ServerSocket
00162 +---------------------------------------------------------------------*/
00163 ATX_DECLARE_INTERFACE(ATX_ServerSocket)
00164 ATX_BEGIN_INTERFACE_DEFINITION(ATX_ServerSocket)
00165     ATX_Result (*Listen)(ATX_ServerSocket* self,
00166                          unsigned int      max_clients);
00167     ATX_Result (*WaitForNewClient)(ATX_ServerSocket* self,
00168                                    ATX_Socket**      client);
00169 ATX_END_INTERFACE_DEFINITION
00170 
00171 /*----------------------------------------------------------------------
00172 |   convenience macros
00173 +---------------------------------------------------------------------*/
00174 #define ATX_ServerSocket_Listen(object, max_clients) \
00175 ATX_INTERFACE(object)->Listen(object, max_clients)
00176 
00177 #define ATX_ServerSocket_WaitForNewClient(object, client) \
00178 ATX_INTERFACE(object)->WaitForNewClient(object, client)
00179 
00180 /*----------------------------------------------------------------------
00181 |   prototypes
00182 +---------------------------------------------------------------------*/
00183 #ifdef __cplusplus
00184 extern "C" {
00185 #endif /* __cplusplus */
00186 
00187 extern ATX_Result ATX_TcpClientSocket_Create(ATX_Socket** bsd_socket);
00188 extern ATX_Result ATX_TcpServerSocket_Create(ATX_ServerSocket** bsd_socket);
00189 extern ATX_Result ATX_UdpSocket_Create(ATX_DatagramSocket** bsd_socket);
00190 
00191 #ifdef __cplusplus
00192 }
00193 #endif /* __cplusplus */
00194 
00195 
00196 #endif /* _ATX_SOCKETS_H_ */
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205