diff options
Diffstat (limited to 'Sockets/tests/sockets_test.cpp')
-rw-r--r-- | Sockets/tests/sockets_test.cpp | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/Sockets/tests/sockets_test.cpp b/Sockets/tests/sockets_test.cpp new file mode 100644 index 0000000..78fd2bc --- /dev/null +++ b/Sockets/tests/sockets_test.cpp @@ -0,0 +1,347 @@ +#ifdef _WIN32 +#pragma warning(disable:4786) +#endif +#include <StdoutLog.h> +#include <SocketHandler.h> +#include <TcpSocket.h> +#include <ListenSocket.h> +#include <Utility.h> +#include <Parse.h> +#include <HttpGetSocket.h> +#include <Socket.h> +#include <HttpDebugSocket.h> + +#ifdef SOCKETS_NAMESPACE +using namespace SOCKETS_NAMESPACE; +#endif + + +class MyHandler : public SocketHandler +{ +public: + MyHandler(StdLog *p) : SocketHandler(p),m_done(false),m_quit(false) {} + ~MyHandler() {} + + void List(TcpSocket *p) { + for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) + { + Socket *p0 = (*it).second; +#ifdef ENABLE_POOL + if (dynamic_cast<ISocketHandler::PoolSocket *>(p0)) + { + p -> Send("PoolSocket\n"); + } + else +#endif + if (dynamic_cast<HttpGetSocket *>(p0)) + { + p -> Send("HttpGetSocket\n"); + } + else + if (dynamic_cast<TcpSocket *>(p0)) + { + p -> Send("TcpSocket\n"); + } + else + { + p -> Send("Some kind of Socket\n"); + } + bool r; + bool w; + bool e; + Get(p -> GetSocket(), r, w, e); + char slask[1000]; + sprintf(slask," Read: %s Write: %s Exception: %s\n", + r ? "SET" : "not set", + w ? "SET" : "not set", + e ? "SET" : "not set"); + p -> Send( slask ); + } + } + void SetQuit() { m_quit = true; } + bool Quit() { return m_quit; } + void CheckHtml() { + if (m_done) + { + if (m_ok) + printf("Html OK:\n%s\n", m_html.c_str()); + else + printf("Html Failed\n"); + m_done = false; + } + } + + std::string m_html; + bool m_ok; + bool m_done; + +private: + bool m_quit; +}; + + +class MySocket : public TcpSocket +{ +public: + MySocket(ISocketHandler& h) : TcpSocket(h) { + } + void OnAccept() { + int port = GetParent() -> GetPort(); + Send("I'm the server at port " + + Utility::l2string(port) + "\n"); + SetCloseAndDelete(); + } +}; + + +class hSocket : public HttpGetSocket +{ +public: + hSocket(ISocketHandler& h,const std::string& x,const std::string& y) : HttpGetSocket(h,x,y) {} + + void OnConnect() { + printf("hSocket::OnConnect\n"); + HttpGetSocket::OnConnect(); + } +}; + + +class OrderSocket : public TcpSocket +{ +public: + OrderSocket(ISocketHandler& h) : TcpSocket(h) { + SetLineProtocol(); + } + Socket *Create() { + Handler().LogError(this, "Create", 0, "OrderSocket", LOG_LEVEL_INFO); + return new OrderSocket(Handler()); + } + void OnAccept() { + Send("Cmd (get,quit,list,stop,detach,count,resolve <name>)>"); + } + void OnLine(const std::string& line) { + Parse pa(line); + std::string cmd = pa.getword(); + std::string arg = pa.getrest(); + if (cmd == "get") + { + HttpGetSocket *p = new hSocket(Handler(), arg, "tmpfile.html"); + p -> SetHttpVersion("HTTP/1.1"); + p -> AddResponseHeader("Connection", "keep-alive"); + p -> SetDeleteByHandler(); + Handler().Add( p ); + Send("Reading url '" + arg + "'\n"); + } + else + if (cmd == "quit") + { + Send("Goodbye!\n"); + SetCloseAndDelete(); + } + else + if (cmd == "list") + { + static_cast<MyHandler&>(Handler()).List( this ); + } + else + if (cmd == "stop") + { + static_cast<MyHandler&>(Handler()).SetQuit(); + } + else + if (cmd == "resolve") + { + //Resolve( arg ); + ipaddr_t a; + if (Utility::u2ip(arg, a)) + { + std::string tmp; + Utility::l2ip(a, tmp); + Send("Resolved: " + tmp + "\n"); + } + else + { + Send("Resolve failed: " + arg + "\n"); + } + } + else +/* + if (cmd == "reverse") + { + ipaddr_t a; + Utility::u2ip(arg, a); // ip -> ipaddr_t + int id = Socket::Resolve(a, 0); + Send("Resolve id = " + Utility::l2string(id) + "\n"); + } + else +*/ +#ifdef ENABLE_DETACH + if (cmd == "detach") + { + if (!Detach()) + { + Send("Detach() call failed\n"); + } + else + { + Send("Ok.\n"); + } + } + else +#endif + if (cmd == "count") + { + Send("Socket count: " + Utility::l2string( (long)Handler().GetCount()) + "\n"); + } + else + { + Send("Huh?\n"); + } + Send("Cmd>"); + } + void OnDelete() { + printf("OrderSocket::OnDelete()\n"); + } +#ifdef ENABLE_RESOLVER + void OnResolved(int id,ipaddr_t a,port_t port) + { + } + void OnResolved(int id,const std::string& name,port_t port) + { + Send("Resolve id " + Utility::l2string(id) + " = " + name + "\n"); + } +/* + void OnResolved(const char *p,size_t l) { + printf("OnResolved, %d bytes:\n", l); + for (size_t i = 0; i < l; i++) + { + unsigned char c = p[i]; + if (isprint(c)) + printf("%c",c); + else + printf("<%02X>",c); + } + printf("\n"); + } +*/ +#endif +#ifdef ENABLE_DETACH + void OnDetached() { + Send("\nDetached.\nCmd>"); + } +#endif +}; + + +class TestSocket : public TcpSocket +{ +public: + TestSocket(ISocketHandler& h) : TcpSocket(h) { + SetLineProtocol(); + } + void OnConnect() { + printf("TestSocket connected, sending QUIT\n"); + Send( "quit\n" ); + } + void OnConnectFailed() { + printf("TestSocket::OnConnectFailed\n"); + SetCloseAndDelete(); + } + void OnLine(const std::string& line) { + printf("TestSocket: %s\n", line.c_str()); + } + void OnDelete() { + printf("TestSocket::OnDelete()\n"); + } +#ifdef ENABLE_RESOLVER + void OnResolved(int id,ipaddr_t a,port_t port) { + printf("TestSocket::OnResolved(): %d, %08x:%d\n", id, a, port); + TcpSocket::OnResolved(id,a,port); + } +#endif +}; + + +int main() +{ + StdoutLog log; + MyHandler h(&log); + +#ifdef ENABLE_RESOLVER + h.EnableResolver(9999); +#endif +// Utility::ResolveLocal(); + printf(" *** My hostname: %s\n", Utility::GetLocalHostname().c_str()); + printf(" *** My local IP: %s\n", Utility::GetLocalAddress().c_str()); + + // socks4 options +/* + h.SetSocks4Host("127.0.0.1"); + h.SetSocks4Port(1080); + h.SetSocks4Userid("www.alhem.net"); + h.SetSocks4TryDirect( true ); + printf("Socks4Host: %x\n", h.GetSocks4Host()); +*/ + + // first server + ListenSocket<MySocket> l1(h); + if (l1.Bind(1024)) + { + printf("Bind 1024 failed\n"); + exit(-1); + } + h.Add(&l1); + + // second server + ListenSocket<MySocket> l2(h); + if (l2.Bind(1025)) + { + printf("Bind 1025 failed\n"); + exit(-1); + } + h.Add(&l2); + + // line server + ListenSocket<OrderSocket> l3(h); + if (l3.Bind(1027)) + { + printf("Bind 1027 failed\n"); + exit(-1); + } + h.Add(&l3); + + // http debug + ListenSocket<HttpDebugSocket> l4(h); + if (l4.Bind(8080)) + { + printf("Bind 8080 failed\n"); + exit(-1); + } + h.Add(&l4); + + // wait for resolver to really start +#ifdef ENABLE_RESOLVER + printf("Waiting for resolver ..."); + while (!h.ResolverReady()) + ; + printf(" resolver ready!\n"); +#endif + + TestSocket ts(h); +printf(">>> TestSocket.Open\n"); + ts.Open("localhost", 1027); +printf(">>> Adding TestSocket\n"); + h.Add(&ts); + +printf(">>> mainloop\n"); + h.Select(0,0); + while (!h.Quit()) + { + h.Select(1,0); + h.CheckSanity(); + } + + return 0; +} + + |