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 void ATX_IpAddress_Reset(ATX_IpAddress* address);
00062 void ATX_IpAddress_SetFromLong(ATX_IpAddress* address,
00063                                unsigned long  long_addr);
00064 unsigned long ATX_IpAddress_AsLong(const ATX_IpAddress* address);
00065 ATX_Result ATX_IpAddress_Parse(ATX_IpAddress* address, ATX_CString name);
00066 ATX_Result ATX_IpAddress_ResolveName(ATX_IpAddress* address,
00067                                      ATX_CString    name, 
00068                                      ATX_Timeout    timeout);
00069 void ATX_IpAddress_Copy(ATX_IpAddress* address,
00070                         ATX_IpAddress* other);
00071 void ATX_SocketAddress_Reset(ATX_SocketAddress* address);
00072 void ATX_SocketAddress_Set(ATX_SocketAddress* address,
00073                            ATX_IpAddress*     ip_address,
00074                            ATX_IpPort         port);
00075 
00076 /*----------------------------------------------------------------------
00077 |   ATX_Socket
00078 +---------------------------------------------------------------------*/
00079 ATX_DECLARE_INTERFACE(ATX_Socket)
00080 ATX_BEGIN_INTERFACE_DEFINITION(ATX_Socket)
00081     ATX_Result (*Bind)(ATX_Socket*              self, 
00082                        const ATX_SocketAddress* address);
00083     ATX_Result (*Connect)(ATX_Socket*              self, 
00084                           const ATX_SocketAddress* address,
00085                           ATX_Timeout              timeout);
00086     ATX_Result (*GetInputStream)(ATX_Socket*         self, 
00087                                  ATX_InputStream**   stream);
00088     ATX_Result (*GetOutputStream)(ATX_Socket*         self, 
00089                                   ATX_OutputStream**  stream);
00090     ATX_Result (*GetInfo)(ATX_Socket*         self, 
00091                           ATX_SocketInfo*     info);
00092 ATX_END_INTERFACE_DEFINITION
00093 
00094 /*----------------------------------------------------------------------
00095 |   convenience macros
00096 +---------------------------------------------------------------------*/
00097 #define ATX_Socket_Bind(object, address) \
00098 ATX_INTERFACE(object)->Bind(object, address)
00099 
00100 #define ATX_Socket_Connect(object, address, timeout) \
00101 ATX_INTERFACE(object)->Connect(object, \
00102                                address,              \
00103                                timeout)
00104 
00105 #define ATX_Socket_GetInputStream(object, stream)\
00106 ATX_INTERFACE(object)->GetInputStream(object, stream)
00107 
00108 #define ATX_Socket_GetOutputStream(object, stream)\
00109 ATX_INTERFACE(object)->GetOutputStream(object, stream)
00110 
00111 #define ATX_Socket_GetInfo(object, info)\
00112 ATX_INTERFACE(object)->GetInfo(object, info)
00113 
00114 /*----------------------------------------------------------------------
00115 |   functions
00116 +---------------------------------------------------------------------*/
00117 ATX_Result ATX_Socket_ConnectToHost(ATX_Socket* self,
00118                                     ATX_CString host,
00119                                     ATX_IpPort  port,
00120                                     ATX_Timeout timeout);
00121 
00122 /*----------------------------------------------------------------------
00123 |   ATX_DatagramSocket
00124 +---------------------------------------------------------------------*/
00125 ATX_DECLARE_INTERFACE(ATX_DatagramSocket)
00126 ATX_BEGIN_INTERFACE_DEFINITION(ATX_DatagramSocket)
00127     ATX_Result (*Send)(ATX_DatagramSocket*         self,
00128                        const ATX_DataBuffer*       packet, 
00129                        const ATX_SocketAddress*    address);
00130     ATX_Result (*Receive)(ATX_DatagramSocket*         self,
00131                           ATX_DataBuffer*             packet, 
00132                           ATX_SocketAddress*          address);
00133 ATX_END_INTERFACE_DEFINITION
00134 
00135 /*----------------------------------------------------------------------
00136 |   convenience macros
00137 +---------------------------------------------------------------------*/
00138 #define ATX_ServerSocket_Send(object, packet, address) \
00139 ATX_INTERFACE(object)->Send(object, packet, address)
00140 
00141 #define ATX_ServerSocket_Receive(object, packet, address) \
00142 ATX_INTERFACE(object)->Receive(object, packet, address)
00143 
00144 /*----------------------------------------------------------------------
00145 |   ATX_ServerSocket
00146 +---------------------------------------------------------------------*/
00147 ATX_DECLARE_INTERFACE(ATX_ServerSocket)
00148 ATX_BEGIN_INTERFACE_DEFINITION(ATX_ServerSocket)
00149     ATX_Result (*Listen)(ATX_ServerSocket* self,
00150                          unsigned int      max_clients);
00151     ATX_Result (*WaitForNewClient)(ATX_ServerSocket* self,
00152                                    ATX_Socket**      client);
00153 ATX_END_INTERFACE_DEFINITION
00154 
00155 /*----------------------------------------------------------------------
00156 |   convenience macros
00157 +---------------------------------------------------------------------*/
00158 #define ATX_ServerSocket_Listen(object, max_clients) \
00159 ATX_INTERFACE(object)->Listen(object, max_clients)
00160 
00161 #define ATX_ServerSocket_WaitForNewClient(object, client) \
00162 ATX_INTERFACE(object)->WaitForNewClient(object, client)
00163 
00164 /*----------------------------------------------------------------------
00165 |   prototypes
00166 +---------------------------------------------------------------------*/
00167 #ifdef __cplusplus
00168 extern "C" {
00169 #endif /* __cplusplus */
00170 
00171 extern ATX_Result ATX_TcpClientSocket_Create(ATX_Socket** bsd_socket);
00172 extern ATX_Result ATX_TcpServerSocket_Create(ATX_ServerSocket** bsd_socket);
00173 extern ATX_Result ATX_UdpSocket_Create(ATX_DatagramSocket** bsd_socket);
00174 
00175 #ifdef __cplusplus
00176 }
00177 #endif /* __cplusplus */
00178 
00179 
00180 #endif /* _ATX_SOCKETS_H_ */
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189