00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _ATX_SOCKETS_H_
00011 #define _ATX_SOCKETS_H_
00012
00013
00014
00015
00016 #include "AtxTypes.h"
00017 #include "AtxStreams.h"
00018 #include "AtxDataBuffer.h"
00019
00020
00021
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
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
00060
00061 #ifdef __cplusplus
00062 extern "C" {
00063 #endif
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
00083
00084
00085
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
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
00124
00125 #ifdef __cplusplus
00126 extern "C" {
00127 #endif
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
00136
00137
00138
00139
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
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
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
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
00182
00183 #ifdef __cplusplus
00184 extern "C" {
00185 #endif
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
00194
00195
00196 #endif
00197
00198
00199
00200
00201
00202
00203
00204
00205