Listener Client
#include <cctype> #include <iostream> #include <fstream> #include <string> using std::string; #include <cleansocks.h> #include <cleanip.h> #include <cleanbuf.h> using namespace cleansocks; #include "sha256.h" // Port numbers. const int DFLTPORT = 45100; // Prompt and read, when you're just not capable of adult forms of // configuration. template <typename T> T pandr(string prompt) { std::cout << prompt << ": "; T ret; std::cin >> ret; return ret; } // Tell if the string ends with .conf bool is_dot_conf(string s) { return s.length() > 5 && s.substr(s.length() - 5) == ".conf"; } int main(int argc, char **argv) { string pgm = argv[0]; ++argv; --argc; // Port numbers int portno = DFLTPORT+1; // Parms. Lots of ways to provide string hn; int pno = DFLTPORT; if(argc == 1 && is_dot_conf(argv[0])) { // .conf file std::ifstream in(argv[0]); in >> hn >> pno; } else if(argc > 0) { // Command line. hn = *argv++; argc--; if(argc > 0 && isdigit(argv[0][0])) { pno = std::atoi(*argv++); argc--; } } else { hn = pandr<string>("Host"); pno = pandr<int>("Port"); } // Listener uses the even port if(pno % 2 == 1) --pno; // Connect. try { TCPsocket sock; IPaddress host = lookup_host(hn); IPport port = pno; connect(sock, IPendpoint(host,port)); buffered_socket bs(sock); std::cout << "Connected" << std::endl; char buf[1024]; int n; while((n = recvln(bs, buf, sizeof buf)) > 0) { std::cout << string(buf,n-2) << std::endl; } } catch(std::exception &e) { std::cout << "Error: " << e.what() << std::endl; } }