00001 #include <dashel/dashel.h> 00002 #include <iostream> 00003 #include <cassert> 00004 00005 using namespace std; 00006 using namespace Dashel; 00007 00008 class PingServer: public Hub 00009 { 00010 public: 00011 PingServer() 00012 { 00013 listenStream = connect("udp:port=8765"); 00014 } 00015 00016 protected: 00017 Stream* listenStream; 00018 map<Stream*, string> nicks; 00019 00020 protected: 00021 void connectionCreated(Stream *stream) { } 00022 00023 void incomingData(Stream *stream) 00024 { 00025 cerr << "new data...."; 00026 PacketStream* packetStream = dynamic_cast<PacketStream*>(stream); 00027 assert(packetStream); 00028 IPV4Address source; 00029 00030 packetStream->receive(source); 00031 cerr << "Ping from " << source.hostname() << ":" << source.port << ": "; 00032 00033 char c; 00034 while (true) 00035 { 00036 packetStream->read(&c, 1); 00037 if (c) 00038 cerr << c; 00039 else 00040 break; 00041 } 00042 cerr << endl; 00043 } 00044 00045 void connectionClosed(Stream *stream, bool abnormal) { } 00046 }; 00047 00048 class PingClient: public Hub 00049 { 00050 public: 00051 PingClient(const string& remoteTarget, const string& msg) 00052 { 00053 PacketStream* packetStream = dynamic_cast<PacketStream*>(connect("udp:port=8766")); 00054 assert(packetStream); 00055 00056 packetStream->write(msg.c_str(), msg.length()); 00057 char c = 0; 00058 packetStream->write(&c, 1); 00059 00060 packetStream->send(IPV4Address(remoteTarget, 8765)); 00061 } 00062 00063 protected: 00064 00065 void connectionCreated(Stream *stream) { } 00066 00067 void incomingData(Stream *stream) { } 00068 00069 void connectionClosed(Stream *stream, bool abnormal) { } 00070 }; 00071 00072 int main(int argc, char* argv[]) 00073 { 00074 try 00075 { 00076 if (argc > 2) 00077 { 00078 PingClient client(argv[1], argv[2]); 00079 } 00080 else if (argc > 1) 00081 { 00082 PingClient client(argv[1], "default message, the other side does lack creativity"); 00083 } 00084 else 00085 { 00086 PingServer().run(); 00087 } 00088 } 00089 catch(DashelException e) 00090 { 00091 std::cerr << e.what() << std::endl; 00092 } 00093 00094 return 0; 00095 }