Go to the documentation of this file.00001
00009
00010
00011
00012
00013 #include <ecl/config/ecl.hpp>
00014
00015 #ifdef ECL_IS_POSIX
00016 #ifndef ECL_IS_MAC
00017
00018
00019
00020
00021
00022 #include <iostream>
00023 #include <ecl/command_line.hpp>
00024 #include <ecl/threads/thread.hpp>
00025 #include <ecl/time/sleep.hpp>
00026 #include <ecl/time/timestamp.hpp>
00027 #include <ecl/devices/socket_connection_status.hpp>
00028 #include <ecl/devices/socket.hpp>
00029 #include <ecl/formatters.hpp>
00030
00031
00032
00033
00034
00035 namespace ecl {
00036 namespace demos {
00037
00038
00039
00040
00041
00042 using ecl::CmdLine;
00043 using ecl::ValueArg;
00044 using ecl::SwitchArg;
00045 using ecl::ArgException;
00046 using ecl::ConnectionHungUp;
00047 using ecl::SocketServer;
00048 using ecl::Format;
00049 using ecl::Hex;
00050 using ecl::NoAlign;
00051 using ecl::Thread;
00052 using ecl::MilliSleep;
00053 using ecl::TimeStamp;
00054
00055
00056
00057
00058
00059 class Reader {
00060 public:
00061 Reader(SocketServer &socket_server, bool timestamps_reqd, bool hex_format_reqd, const int &port_number) :
00062 socket(socket_server),
00063 timestamps(timestamps_reqd),
00064 hex(hex_format_reqd),
00065 port(port_number),
00066 new_line(true)
00067 {}
00068
00069 void loop() {
00070
00071 Format<unsigned char> hex_format(-1,NoAlign,Hex);
00072 char c;
00073 long ch_read;
00074 MilliSleep sleep;
00075
00076 if ( hex ) { std::cout << "Hex format" << std::endl; } else { std::cout << "Ascii format" << std::endl; }
00077
00078 while (1) {
00079 ch_read = socket.read(c);
00080 if ( ch_read > 0 ) {
00081 if ( hex ) {
00082 if ( timestamps ) {
00083 if ( new_line ) { timestamp.stamp(); }
00084 std::cout << "[" << timestamp << "] : ";
00085 }
00086 std::cout << hex_format(c) << std::endl;
00087 } else {
00088 if ( timestamps && new_line ) {
00089 timestamp.stamp();
00090 std::cout << "[" << timestamp << "] : ";
00091 }
00092 std::cout << c;
00093 }
00094 std::cout.flush();
00095 if ( timestamps ) {
00096 if ( new_line ) {
00097 new_line = false;
00098 } else if ( c == '\n' ) {
00099 new_line = true;
00100 }
00101 }
00102 } else if ( ch_read < 0 ) {
00103 if ( ch_read == ConnectionHungUp ) {
00104 std::cout << "Client Hung Up." << std::endl;
00105 exit(EXIT_FAILURE);
00106 }
00107 } else {
00108
00109 }
00110 sleep(15);
00111 }
00112
00113 }
00114
00115 private:
00116 SocketServer &socket;
00117 TimeStamp timestamp;
00118 bool timestamps;
00119 bool hex;
00120 int port;
00121 bool new_line;
00122 };
00123
00124 class Writer {
00125 public:
00126 Writer(SocketServer &socket_server, bool timestamps_reqd) :
00127 socket(socket_server),
00128 timestamps(timestamps_reqd)
00129 {}
00130
00131 void loop() {
00132 MilliSleep sleep;
00133 char buffer[256];
00134 memset(buffer,0,256);
00135 char *s_ptr;
00136 while( 1 ) {
00137 if ( fgets(buffer,80,stdin) == NULL ) {
00138 break;
00139 }
00140
00141
00142 s_ptr = buffer;
00143 while ( *s_ptr != '\0') { ++s_ptr; }
00144 if ( timestamps ) { timestamp.stamp(); }
00145 socket.write(buffer,s_ptr - buffer);
00146 if ( timestamps ) {
00147 std::cout << "[" << timestamp << "] : ";
00148 }
00149 std::cout << buffer;
00150 std::cout.flush();
00151 sleep(500);
00152 }
00153
00154 }
00155
00156 private:
00157 SocketServer &socket;
00158 TimeStamp timestamp;
00159 bool timestamps;
00160 };
00161
00162 }
00163 }
00164
00165
00166
00167
00168
00169 using namespace ecl::demos;
00170
00171
00172
00173
00174
00175 int main(int argc, char** argv) {
00176
00177 std::cout << std::endl;
00178 std::cout << "***********************************************************" << std::endl;
00179 std::cout << " Parsing Command Line" << std::endl;
00180 std::cout << "***********************************************************" << std::endl;
00181 std::cout << std::endl;
00182 int port = 0;
00183 bool hex(false);
00184 bool timestamps(false);
00185
00186 try {
00187 CmdLine cmd("This is a simple interface for making serving from a socket.",' ',"0.1");
00188 ValueArg<int> arg_port("p","port","Port to connect to [1470].",false,1470,"integer");
00189 SwitchArg switch_hex("x","hex","Enable hex output.",false);
00190 SwitchArg switch_timestamps("t","timestamp","Timestamp incoming/outgoings.",false);
00191
00192 cmd.add(arg_port);
00193 cmd.add(switch_hex);
00194 cmd.add(switch_timestamps);
00195 cmd.parse(argc,argv);
00196
00197 hex = switch_hex.getValue();
00198 port = arg_port.getValue();
00199 timestamps = switch_timestamps.getValue();
00200
00201 } catch ( ArgException &e ) {
00202 std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl;
00203 }
00204
00205 std::cout << "Listening on port: " << port << std::endl;
00206
00207 std::cout << std::endl;
00208 std::cout << "***********************************************************" << std::endl;
00209 std::cout << " Read and Write Threads " << std::endl;
00210 std::cout << "***********************************************************" << std::endl;
00211 std::cout << std::endl;
00212
00213 SocketServer server(port);
00214 server.listen();
00215 Writer writer(server,timestamps);
00216 Reader reader(server,timestamps,hex,port);
00217 Thread read_thread(&Reader::loop, reader);
00218 Thread write_thread(&Writer::loop, writer);
00219
00220 read_thread.join();
00221 write_thread.join();
00222
00223 std::cout << std::endl;
00224 std::cout << "***********************************************************" << std::endl;
00225 std::cout << " Passed" << std::endl;
00226 std::cout << "***********************************************************" << std::endl;
00227 std::cout << std::endl;
00228
00229 return 0;
00230 }
00231
00232 #endif
00233 #endif
00234
00235 #if !defined ECL_IS_POSIX || ECL_IS_MAC
00236
00237 #include <iostream>
00238
00239 int main(int argc, char **argv) {
00240
00241 std::cout << "This is a posix (not mac) only app." << std::endl;
00242 return 0;
00243 }
00244
00245 #endif