1 ////////////////////////////////////////////////////////////////////////////////
3 // Author: Artur Szostak
4 // Email: artur@alice.phy.uct.ac.za | artursz@iafrica.com
6 ////////////////////////////////////////////////////////////////////////////////
8 #ifndef dHLT_SYSTEM_SOCKET_HPP
9 #define dHLT_SYSTEM_SOCKET_HPP
11 #include "BasicTypes.hpp"
13 #include "System/SystemError.hpp"
14 #include "System/SystemTypes.hpp"
26 class SocketError : public System::Error
29 SocketError() throw();
30 virtual const char* Message() const throw();
39 Address(const SocketAddress& address);
40 Address(const InetSocketAddress& address);
41 Address(const UInt ipv4address, const UShort port);
42 Address(const UShort netbyte_order_port, const UInt netbyte_order_address);
43 Address(const char* string);
45 static Address GetHostAddress(const UShort port = 0);
48 UInt Ipv4Address() const;
49 void Ipv4Address(const UInt value);
52 void Port(const UShort port);
54 const char* AsString() const;
55 static const char* AsString(const UInt ipv4address);
56 static const char* AsStringNB(const UInt netbyte_order_address);
63 operator const SocketAddress* () const
65 return (SocketAddress*) &data;
68 operator SocketAddress* ()
70 return (SocketAddress*) &data;
73 operator const char* () const
79 friend std::ostream& operator << (std::ostream& os, const Address& addr);
83 InetSocketAddress data;
92 Socket(const SocketHandle s);
95 bool CanBroadcast() const;
96 void AllowBroadcast(bool value = true);
97 bool CanReuseAddress() const;
98 void AllowAddressReuse(bool value = true);
100 UInt MaxMessageSize() const;
102 Address BroadcastAddress(const UInt localaddress = INADDR_ANY) const;
104 Address LocalAddress() const;
106 void Bind(const Address& address);
108 const Address& TargetAddress() const { return targetaddr; };
109 void TargetAddress(const Address& address) { targetaddr = address; };
110 UInt Send(const char* message, const UInt length);
112 UInt BytesAvailable() const;
114 const Address& SourceAddress() const { return sourceaddr; };
115 UInt Receive(char* message, const UInt length);
117 SocketHandle Handle() const { return handle; };
118 operator SocketHandle () const { return handle; };
120 bool CanRead() const;
121 bool CanWrite() const;
123 bool WaitUntilReadable(
124 const UInt timeout_secs = 0xFFFFFFFF,
125 const UInt timeout_usecs = 0xFFFFFFFF
128 bool WaitUntilWriteable(
129 const UInt timeout_secs = 0xFFFFFFFF,
130 const UInt timeout_usecs = 0xFFFFFFFF
147 void Remove(Socket& s);
148 bool Contains(Socket& s);
150 UInt Size() const { return list.size(); };
152 const Socket* operator [] (UInt index) const;
153 Socket* operator [] (UInt index);
155 friend std::ostream& operator << (std::ostream& os, const SocketList& sl);
159 std::vector<Socket*> list;
171 enum SocketEventTypes
173 SocketReadable = 0x01,
174 SocketWriteable = 0x02,
180 SocketStatus& status,
181 const SocketList& sockets,
182 const int eventflags = SocketReadable | SocketWriteable | SocketFailure,
183 const UInt timeout_secs = 0xFFFFFFFF,
184 const UInt timeout_usecs = 0xFFFFFFFF
187 Socket* WaitForReadable(
188 const SocketList& sockets,
189 const UInt timeout_secs = 0xFFFFFFFF,
190 const UInt timeout_usecs = 0xFFFFFFFF
193 Socket* WaitForWriteable(
194 const SocketList& sockets,
195 const UInt timeout_secs = 0xFFFFFFFF,
196 const UInt timeout_usecs = 0xFFFFFFFF
203 #endif // dHLT_SYSTEM_SOCKET_HPP