X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnetvis.cpp;h=e9c6d50a3719da9628e935911a2c3f75b94b63df;hb=8814de48529f0b5b828372e471a7523b5f2bb6de;hp=3a0f09219449f46dc9bb5d1be56f116cffc0ad0b;hpb=2fe5b8243b3a7e1c6251e83a55d29d175b8905e4;p=netvis.git diff --git a/source/netvis.cpp b/source/netvis.cpp index 3a0f092..e9c6d50 100644 --- a/source/netvis.cpp +++ b/source/netvis.cpp @@ -6,6 +6,9 @@ Distributed unter the GPL */ #include +#include +#include +#include #include #include #include @@ -31,19 +34,21 @@ using namespace std; using namespace Msp; NetVis::NetVis(int argc, char **argv): + max_hosts(1000), + max_visible_hosts(30), draw_labels(true), blend(true), frames(0) { if(argc<2) throw UsageError("No interface given"); - iface=argv[1]; + iface = argv[1]; } int NetVis::main() { char err[1024]; - pcap=pcap_open_live(iface.c_str(), 128, true, 0, err); + pcap = pcap_open_live(iface.c_str(), 128, true, 0, err); if(!pcap) throw Exception(err); @@ -51,12 +56,12 @@ int NetVis::main() throw Exception(err); pcap_lookupnet(iface.c_str(), &localnet, &localnet_mask, err); - localnet=ntohl(localnet); - localnet_mask=ntohl(localnet_mask); + localnet = ntohl(localnet); + localnet_mask = ntohl(localnet_mask); - dpy=new Graphics::Display; - wnd=new Graphics::Window(*dpy, 1024, 768); - glc=new Graphics::GLContext(*wnd); + dpy = new Graphics::Display; + wnd = new Graphics::Window(*dpy, 1024, 768); + glc = new Graphics::GLContext(*wnd); wnd->set_title("NetVis"); wnd->signal_close.connect(sigc::bind(sigc::mem_fun(this, &NetVis::exit), 0)); wnd->signal_key_press.connect(sigc::mem_fun(this, &NetVis::key_press)); @@ -65,15 +70,12 @@ int NetVis::main() GL::enable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - font=new GL::Font; + font = new GL::Font; DataFile::load(*font, "dejavu-10.font"); - font_tex=new GL::Texture2D; - DataFile::load(*font_tex, "dejavu-10.tex"); - font->set_texture(*font_tex); catch_signal(SIGINT); - resolver=new Resolver; + resolver = new Resolver; //set_loop_mode(TICK_BUSY); @@ -82,7 +84,6 @@ int NetVis::main() delete resolver; delete font; - delete font_tex; delete glc; delete wnd; delete dpy; @@ -105,24 +106,24 @@ int NetVis::main() void NetVis::tick() { - Msp::Time::TimeStamp t=Msp::Time::now(); + Msp::Time::TimeStamp t = Msp::Time::now(); Msp::Time::TimeDelta dt; if(tick_t) - dt=t-tick_t; - tick_t=t; + dt = t-tick_t; + tick_t = t; if(tick_t>fps_t+Msp::Time::sec) { - fps=frames/((tick_t-fps_t)/Msp::Time::sec); - fps_t=tick_t; - frames=0; + fps = frames/((tick_t-fps_t)/Msp::Time::sec); + fps_t = tick_t; + frames = 0; } dpy->tick(); { Debug::ProfilingScope s(profiler, "capture"); - while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast(this))>0); + while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast(this))>0) ; } { @@ -130,36 +131,42 @@ void NetVis::tick() resolver->tick(); - float min_activity=1e7f; + float min_activity = numeric_limits::max(); for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) { i->second->tick(dt); - min_activity=min(min_activity, i->second->get_activity()); + min_activity = min(min_activity, i->second->get_activity()); } - for(map::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end(); ++i) - i->second->tick(dt); - + float del_limit = pow(10, 6-0.1*(max_hosts-hosts.size()-disabled_hosts.size())); for(map::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end();) { + i->second->tick(dt); + if(i->second->get_activity()>min_activity) { i->second->set_active(true); hosts.insert(*i); disabled_hosts.erase(i++); } + else if(i->second->get_activity()second; + disabled_hosts.erase(i++); + } else ++i; } - if(hosts.size()>20) + + if(hosts.size()>max_visible_hosts) { list activity; for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) activity.push_back(i->second->get_activity()); activity.sort(); - list::iterator j=activity.begin(); - advance(j, activity.size()-20); - float limit=*j; + list::iterator j = activity.begin(); + advance(j, activity.size()-max_visible_hosts); + float limit = *j; for(map::iterator i=hosts.begin(); i!=hosts.end();) { @@ -180,7 +187,7 @@ void NetVis::tick() if((*i)->get_stale()) { delete *i; - i=packets.erase(i); + i = packets.erase(i); } else ++i; @@ -214,10 +221,10 @@ void NetVis::tick() GL::push_matrix(); GL::translate(-500, 360, 0); - unsigned n=0; + unsigned n = 0; for(map::iterator i=port_colors.begin(); (i!=port_colors.end() && n<20); ++i, ++n) { - GL::Color &color=i->second; + GL::Color &color = i->second; imm.begin(GL::QUADS); imm.color(color.r, color.g, color.b, color.a); @@ -241,7 +248,7 @@ void NetVis::tick() GL::translate(-484, 361, 0); GL::scale_uniform(10); glColor4f(1.0, 1.0, 1.0, 1.0); - n=0; + n = 0; for(map::iterator i=port_colors.begin(); (i!=port_colors.end() && n<20); ++i, ++n) { font->draw_string(format("%d", i->first)); @@ -270,80 +277,80 @@ void NetVis::tick() Host &NetVis::get_host(unsigned a) { - map::iterator i=hosts.find(a); + map::iterator i = hosts.find(a); if(i!=hosts.end()) return *i->second; - i=disabled_hosts.find(a); + i = disabled_hosts.find(a); if(i!=disabled_hosts.end()) return *i->second; - Host *host=new Host(*this, a); + Host *host = new Host(*this, a); if((a&localnet_mask)==localnet) host->set_local(true); resolver->push(host); host->set_position(Vector2(rand()*400.0/RAND_MAX-200.0, rand()*400.0/RAND_MAX-200.0)); - hosts[a]=host; + hosts[a] = host; return *host; } GL::Color &NetVis::get_port_color(unsigned port) { - map::iterator i=port_colors.find(port); + map::iterator i = port_colors.find(port); if(i!=port_colors.end()) return i->second; GL::Color color; while(1) { - color.r=rand()*1.0/RAND_MAX; - color.g=rand()*1.0/RAND_MAX; - color.b=rand()*1.0/RAND_MAX; + color.r = rand()*1.0/RAND_MAX; + color.g = rand()*1.0/RAND_MAX; + color.b = rand()*1.0/RAND_MAX; if(color.r>0.5 || color.g>0.5 || color.b>0.7) break; } - color.a=0.4f; - return port_colors[port]=color; + color.a = 0.4f; + return port_colors[port] = color; } void NetVis::key_press(unsigned key, unsigned, wchar_t) { if(key==46) - draw_labels=!draw_labels; + draw_labels = !draw_labels; else if(key==56) { - blend=!blend; + blend = !blend; GL::set(GL_BLEND, blend); } } void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *, const unsigned char *data) { - NetVis *self=reinterpret_cast(user); + NetVis *self = reinterpret_cast(user); - const ethhdr *eth=reinterpret_cast(data); + const ethhdr *eth = reinterpret_cast(data); if(ntohs(eth->h_proto)==ETH_P_IP) { - const iphdr *ip=reinterpret_cast(eth+1); + const iphdr *ip = reinterpret_cast(eth+1); - unsigned size=ntohs(ip->tot_len); - unsigned port=0; + unsigned size = ntohs(ip->tot_len); + unsigned port = 0; if(ip->protocol==IPPROTO_TCP) { - const tcphdr *tcp=reinterpret_cast(ip+1); - port=min(ntohs(tcp->source), ntohs(tcp->dest)); + const tcphdr *tcp = reinterpret_cast(ip+1); + port = min(ntohs(tcp->source), ntohs(tcp->dest)); } else if(ip->protocol==IPPROTO_UDP) { - const udphdr *udp=reinterpret_cast(ip+1); - port=min(ntohs(udp->source), ntohs(udp->dest)); + const udphdr *udp = reinterpret_cast(ip+1); + port = min(ntohs(udp->source), ntohs(udp->dest)); } - Host &shost=self->get_host(ntohl(ip->saddr)); - Host *dhost=0; + Host &shost = self->get_host(ntohl(ip->saddr)); + Host *dhost = 0; if((ntohl(ip->daddr)&0xFF)!=0xFF) - dhost=&self->get_host(ntohl(ip->daddr)); + dhost = &self->get_host(ntohl(ip->daddr)); - float throttle=shost.send_packet(); + float throttle = shost.send_packet(); if(throttle<1) { self->packets.push_back(new Packet(shost, dhost, self->get_port_color(port), size));