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 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
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
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
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
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
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
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
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
00166
00167 #ifdef __cplusplus
00168 extern "C" {
00169 #endif
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
00178
00179
00180 #endif
00181
00182
00183
00184
00185
00186
00187
00188
00189