int main() { Poll p; //create server instance cppspEmbedded::Server srv(&p,"/"); //per-request state machine struct handler: public HandlerBase { void process() { response->write("aaaaa"); //flush content and headers; when writeback is done, flushCB() is called response->finalize({&handler::flushCB,this}); } void flushCB(Response&) { cb(); } }; //attach a custom request router srv.attachHandler(makeHandler<handler>()); //bind, listen, and accept, passing received sockets to the server Socket s; s.bind("0.0.0.0","16971",AF_INET,SOCK_STREAM); s.listen(); srv.listen(s); //add socket to epoll, and run the event loop p.add(s); p.loop(); }
int main(int argc, char** argv) { Poll p; Socket s(AF_INET,SOCK_STREAM); s.bind(IPEndPoint(IPAddress("0.0.0.0"),16969)); s.listen(); s.repeatAccept([&p](Socket* s1) { p.add(*s1); new client(*s1); s1->release(); }); p.add(s); p.loop(); }
int main() { Poll p; Socket s; s.bind("0.0.0.0","7000",AF_INET,SOCK_STREAM); s.listen(); struct { Poll& p; void operator()(Socket* s) { cout << "assssssss" << endl; struct handler { Poll& p; StreamReader sr; RGC::Ref<Socket> s; void lineCB(const string& l) { cout << "got line: " << l << endl; struct header { int a; void* v; char pad[8192]; int x; }* h=(header*)l.data(); h->pad[h->a]=h->x; delete this; } handler(Poll& p, Socket& s): p(p),sr(s),s(s) { sr.readLine(StreamReader::Callback(&handler::lineCB,this)); } } *hdlr=new handler(p,*s); p.add(*s); s->release(); } } cb {p}; s.repeatAccept(&cb); p.add(s); p.loop(); }
int main(int argc, char **argv) { int i = 0; parseArgs(argc, argv, [&](char* name, const std::function<char*()>& getvalue) { char* tmpv; if(name==NULL) { switch(i) { case 0: iptsocks_params.socks_host=getvalue(); break; case 1: iptsocks_params.socks_port=getvalue(); break; } i++; } else if(strcmp(name,"d")==0) { if((tmpv=getvalue())==NULL)throw logic_error("-d(dns_port) requires a value"); iptsocks_params.dns_port=atoi(tmpv); } else if(strcmp(name,"p")==0) { if((tmpv=getvalue())==NULL)throw logic_error("-p(tcp_port) requires a value"); iptsocks_params.tcp_port=atoi(tmpv); } else if(strcmp(name,"s")==0) { if((tmpv=getvalue())==NULL)throw logic_error("-s(mapping_start_address) requires a value"); iptsocks_params.start_addr=tmpv; } else if(strcmp(name,"e")==0) { if((tmpv=getvalue())==NULL)throw logic_error("-e(mapping_end_address) requires a value"); iptsocks_params.end_addr=tmpv; } else if(strcmp(name,"h")==0) { cout << "usage: " << argv[0] << " [-p tcp_port] [-d dns_port] [-s mapping_start_address] [-e mapping_end_address] [socks_host] [socks_port]" << endl; exit(0); } }); if (iptsocks_params.end_addr.length() == 0) { iptsocks_params.end_addr = (IPAddress(iptsocks_params.start_addr.c_str()) + 65534).toStr(); } WARN(1, "params: socks_host=" << iptsocks_params.socks_host << "; socks_port=" << iptsocks_params.socks_port << "; tcp_port=" << iptsocks_params.tcp_port << "; dns_port=" << iptsocks_params.dns_port << "; mapping_start_address=" << iptsocks_params.start_addr << "; mapping_end_address=" << iptsocks_params.end_addr << ";"); pool= {IPAddress(iptsocks_params.start_addr.c_str()),IPAddress(iptsocks_params.end_addr.c_str())}; Poll p; auto vect = EndPoint::lookupHost(iptsocks_params.socks_host.c_str(), iptsocks_params.socks_port.c_str(), 0, SOCK_STREAM); if (vect.size() < 0) throw runtime_error("could not resolve host name of SOCKS server"); socks_host_ep = vect[0]; WARN(1, "SOCKS server endpoint: " << socks_host_ep->toStr()); Socket s(AF_INET, SOCK_STREAM, 0); IPEndPoint ep(IPAddress("0.0.0.0"), iptsocks_params.tcp_port); s.bind(ep); s.listen(); p.add(s); struct { Poll& p; void operator()(HANDLE h) { iptsocks_connection* conn = new iptsocks_connection(p, h); conn->release(); } } cb1 { p }; s.repeatAcceptHandle(&cb1); struct { void operator()(DNSServer& srv, const EndPoint& ep, const DNSServer::dnsreq& req) { WARN(6, "RECEIVED DNS PACKET"); /*auto tmp=pool.get(); if(tmp.second)ip=tmp.first; else ip=IPAddress("127.0.0.1");*/ DNSServer::dnsreq resp(req.create_answer()); IPAddress ip1[resp.queries.size()]; for (int i = 0; i < (int) resp.queries.size(); i++) { //only support A record lookups if (resp.queries[i].type != 1) continue; ip1[i] = map_host(resp.queries[i].q); DNSServer::answer a { i, resp.queries[i].type, resp.queries[i].cls, 100000000, string { (const char*) &ip1[i].a, sizeof(ip1[i].a) } }; resp.answers.push_back(a); } srv.sendreply(ep, resp); } ; } answer_request; DNSServer* srv; srv = new DNSServer(p, IPEndPoint(IPAddress("127.0.0.1"), iptsocks_params.dns_port), &answer_request); srv->start(); DNSServer* srv1; srv1 = new DNSServer(p, IPEndPoint(IPAddress("0.0.0.0"), iptsocks_params.dns_port), &answer_request); srv1->start(); WARN(2, "started. accepting commands on stdin: ls - list all allocated IPs; lsu - list unreferenced IPs in cache"); StandardStream ss; StreamBuffer sbuf(ss); StreamWriter sw(sbuf); ss.addToPoll(p); StreamReader sr(ss); struct { StreamReader& sr; StreamWriter& sw; void operator()(string l) { if (l.length() <= 0) goto sss; if (l.compare("ls") == 0) { for (auto it = hosts.begin(); it != hosts.end(); it++) { sw.writeF("%s: %s\n", (*it).first.toStr().c_str(), (*it).second.host.c_str()); } } else if (l.compare("lsu") == 0) { for (auto it = unused_hosts.begin(); it != unused_hosts.end(); it++) { sw.writeF("%s: %s\n", (*it).second.toStr().c_str(), hosts[(*it).second].host.c_str()); } } else { sw.write("unknown command\n"); } sw.flush(); sss: if (!sr.eof) begin(); } void begin() { sr.readLine(this); } } cmdcb { sr, sw }; cmdcb.begin(); p.loop(); return 0; }
int main() { StandardStream ss; struct handler { Ref<Stream> s1,s2; list<Buffer> queue; list<Buffer>::iterator last_written; bufferManager bm; Buffer rbuf; vector<iovec> iovecs; bool writing=false; bool shouldExit=false; void startR1() { rbuf=bm.beginGet(); s1->read(rbuf,{&handler::cbR1,this}); } void cbR1(int r) { if(r<=0) { if(writing) shouldExit=true; else exit(0); } bm.endGet(r); rbuf.clip(0,r); queue.push_back(rbuf); rbuf.release(); startW2(); startR1(); } void startW2() { if(writing) return; if(queue.size()<=0) { if(shouldExit)exit(0); return; } writing=true; iovecs.resize(queue.size()); auto it=queue.begin(); for(int i=0;i<iovecs.size();i++) { iovecs[i].iov_base=(*it).data(); iovecs[i].iov_len=(*it).length(); it++; } last_written=it; s2->writevAll(&iovecs[0],iovecs.size(),{&handler::cbW2,this}); } void cbW2(int r) { //printf("cbW2: %i\n",r); if(r<=0) exit(0); queue.erase(queue.begin(),last_written); writing=false; startW2(); } handler(Stream& s1, Stream& s2):s1(&s1),s2(&s2) { startR1(); } } h(ss,ss); Poll p; ss.addToPoll(p); ss.setBlocking(false); p.loop(); }