$search
00001 00010 /***************************************************************************** 00011 ** Ifdefs 00012 *****************************************************************************/ 00013 00014 #ifndef ECL_DEVICES_SOCKET_CLIENT_POS_HPP_ 00015 #define ECL_DEVICES_SOCKET_CLIENT_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 /***************************************************************************** 00027 ** Includes 00028 *****************************************************************************/ 00029 00030 #include <arpa/inet.h> // inet_addr() 00031 #include <errno.h> 00032 #include <string> 00033 #include <sys/ioctl.h> // used in remaining() 00034 #include <sys/socket.h> 00035 #include <ecl/exceptions/macros.hpp> 00036 #include <ecl/exceptions/standard_exception.hpp> 00037 #include "socket_connection_status.hpp" 00038 #include "detail/socket_error_handler_pos.hpp" 00039 #include "traits.hpp" 00040 00041 /***************************************************************************** 00042 ** Namespaces 00043 *****************************************************************************/ 00044 00045 namespace ecl { 00046 00047 /***************************************************************************** 00048 ** Interface [SocketClient] 00049 *****************************************************************************/ 00064 class SocketClient { 00065 public: 00066 /********************* 00067 ** C&D 00068 **********************/ 00069 SocketClient() : is_open(false), error_handler(NoError) {}; 00081 SocketClient(const std::string &host_name, const unsigned int &port_number = 5555) ecl_throw_decl(StandardException); 00082 virtual ~SocketClient() { close(); } 00084 /********************* 00085 ** Configuration 00086 **********************/ 00098 bool open( const std::string &hostname, const unsigned int& port_number ) ecl_throw_decl(StandardException); 00099 void close(); 00101 bool open() const { return is_open; } 00102 00103 /********************* 00104 ** Writing 00105 **********************/ 00114 long write(const char &c) ecl_debug_throw_decl(StandardException); 00115 00124 long write(const char *s, unsigned long n) ecl_debug_throw_decl(StandardException); 00125 00132 void flush() {} 00133 00134 /********************* 00135 ** Reading 00136 **********************/ 00144 long remaining(); 00153 long read(char &c) ecl_debug_throw_decl(StandardException); 00173 long read(char *s, const unsigned long &n) ecl_debug_throw_decl(StandardException); 00186 long peek(char*s, const unsigned long &n) ecl_debug_throw_decl(StandardException); 00187 00191 const Error& error() const { return error_handler; } 00192 00193 private: 00194 std::string hostname; 00195 int port; 00196 int socket_fd; 00197 bool is_open; 00198 ecl::Error error_handler; 00199 }; 00200 00201 /***************************************************************************** 00202 ** Traits [Serial] 00203 *****************************************************************************/ 00209 template <> 00210 class is_sink<SocketClient> : public True {}; 00211 00217 template <> 00218 class is_source<SocketClient> : public True {}; 00219 00225 template <> 00226 class is_sourcesink<SocketClient> : public True {}; 00227 00228 } // namespace ecl 00229 00230 #endif /* ECL_IS_POSIX */ 00231 #endif /* !ECL_IS_MAC */ 00232 00233 #endif /* ECL_DEVICES_SOCKET_CLIENT_POS_HPP_ */