$search
00001 00010 /***************************************************************************** 00011 ** Ifdefs 00012 *****************************************************************************/ 00013 00014 #ifndef ECL_DEVICES_SOCKET_SERVER_POS_HPP_ 00015 #define ECL_DEVICES_SOCKET_SERVER_POS_HPP_ 00016 00017 /***************************************************************************** 00018 ** Cross platform 00019 *****************************************************************************/ 00020 00021 #include <ecl/config/ecl.hpp> 00022 #ifndef ECL_IS_MAC 00023 #ifdef ECL_IS_POSIX 00024 00025 /***************************************************************************** 00026 ** Includes 00027 *****************************************************************************/ 00028 00029 #include <arpa/inet.h> // inet_addr() 00030 #include <sys/ioctl.h> // used in remaining() 00031 #include <errno.h> 00032 #include <sys/socket.h> 00033 00034 #include "detail/socket_error_handler_pos.hpp" 00035 #include "detail/socket_exception_handler_pos.hpp" 00036 #include "traits.hpp" 00037 00038 /***************************************************************************** 00039 ** Namespaces 00040 *****************************************************************************/ 00041 00042 namespace ecl { 00043 00044 /***************************************************************************** 00045 ** Interface [SocketServer] 00046 *****************************************************************************/ 00060 class SocketServer { 00061 public: 00062 /********************* 00063 ** C&D 00064 **********************/ 00065 SocketServer() : is_open(false) {}; 00076 SocketServer(const unsigned int &port_number) ecl_throw_decl(StandardException); 00077 virtual ~SocketServer() { close(); }; 00079 /********************* 00080 ** Configuration 00081 **********************/ 00092 bool open( const unsigned int& port_number ) ecl_throw_decl(StandardException); 00110 void close() { is_open = false; ::close(socket_fd); } 00111 00112 bool open() const { return is_open; } 00113 00114 /********************* 00115 ** Writing 00116 **********************/ 00125 long write(const char &c) ecl_debug_throw_decl(StandardException) { return write(&c,1); } 00126 00135 long write(const char *s, unsigned long n) ecl_debug_throw_decl(StandardException); 00136 00143 void flush() {} 00144 00145 /********************* 00146 ** Reading 00147 **********************/ 00155 long remaining(); 00174 long read(char &c) ecl_debug_throw_decl(StandardException) { return read(&c,1); } 00184 long read(char *s, const unsigned long &n) ecl_debug_throw_decl(StandardException); 00195 long peek(char*s, const unsigned long &n) ecl_debug_throw_decl(StandardException); 00196 00197 /********************* 00198 ** Socket Specific 00199 **********************/ 00208 int listen() ecl_throw_decl(StandardException); 00209 00213 const Error& error() const { return error_handler; } 00214 00215 private: 00216 int port; 00217 int socket_fd; 00218 int client_socket_fd; 00219 bool is_open; 00220 Error error_handler; 00221 }; 00222 00223 /***************************************************************************** 00224 ** Traits [Serial] 00225 *****************************************************************************/ 00231 template <> 00232 class is_sink<SocketServer> : public True {}; 00233 00239 template <> 00240 class is_source<SocketServer> : public True {}; 00241 00247 template <> 00248 class is_sourcesink<SocketServer> : public True {}; 00249 00250 } // namespace ecl 00251 00252 #endif /* ECL_IS_POSIX */ 00253 #endif /* !ECL_IS_MAC */ 00254 00255 #endif /* ECL_DEVICES_SOCKET_SERVER_POS_HPP_ */