&)::ltstr' || uses local type `analyzeAllPackets(std::vector
>&)::ltstr'
Hallo,
ich habe ein PacketFile (tcpdum, libpcap) und möchte feststellen, wie
oft eine bestimmte IP Kombination aufgetreten ist.
Ich habe mir das folgendermaßen gedacht:
//...
typedef struct flow_key_t {
uint32_t src_addr;
uint32_t dst_addr;
};
//...
int main( ... )
{
map
Peter Wiersig schrieb:
Bastian Schern wrote:
ich habe ein PacketFile (tcpdum, libpcap) und möchte feststellen, wie oft eine bestimmte IP Kombination aufgetreten ist.
"Ethereal" hilft dir nicht weiter?
Leider nicht, ich muss eine Statistische Paketauswertung mit Sampling und Flow keys machen. Und die Ergebnisse brauche ich dann auch noch in einer Datenbank. Das geht mit Ethereal IMHO nicht. Meine Frage zielte aber eher auf das Problem mit der <map> ab. Ob <map> dafür überhaupt geeignet ist oder ob man es vielleicht ganz anders machen sollte.
On Tue, 2003-10-28 at 12:26, Bastian Schern wrote:
Hallo,
ich habe ein PacketFile (tcpdum, libpcap) und möchte feststellen, wie oft eine bestimmte IP Kombination aufgetreten ist.
Ich habe mir das folgendermaßen gedacht:
//...
typedef struct flow_key_t { uint32_t src_addr; uint32_t dst_addr; };
//...
int main( ... ) { map
flow_keys; for( pkt_num_t i=0; i
//... }
Leider geht das so nicht. Doch ;)
Kleines, zusammengehacktes Beispiel, das vermutlich ziemlich genau das
macht, was Du vorhast:
#include <map>
#include <iostream>
struct mykey_t {
int32_t a;
int32_t b;
} ;
static mykey_t myarray[] = {
{ 0, 1 },
{ 1, 1 },
{ 1, 23 },
{ 2, 1 },
{ 0, 1 },
{ 1, 1 },
{ 1, 1 },
{ 2, 1 },
{ 1, 1 },
{ 4, 1 }
};
bool operator< ( const mykey_t &a, const mykey_t &b)
{
int64_t A = a.a ;
A <<= 32;
A += a.b;
int64_t B = b.a;
B <<= 32;
B += b.b;
return A < B;
}
int main()
{
std::map
&)::ltstr' || uses local type `analyzeAllPackets(std::vector
>&)::ltstr' Ich bekomme folgende Fehlermeldung: trafana.cpp|78| error: template-argument ` || analyzeAllPackets(std::vector
trafana.cpp|78| error: ISO C++ forbids declaration of `flow_keys' with no type Keine Ahnung, was das nun mit dem obigen Code zu tun hat. Ich würde mal darauf tippen, dass Du nicht nur einen Bug in deinem Code hast.
Wie mache ich das am besten und ist <map>? Die Frage ist natürlich auch, ob <map> für meinen Anwendungsfall überhaupt geeignet ist
Kommt darauf an ... prinzipiell ja. Was Du eigentlich suchst, ist ein assoziativer Speicher. std::maps sind eine recht effektive Implementierung davon, in der Literatur gibt es aber noch zahlreiche Andere.
oder ob z.B. eine
besser geeignet ist? Kommt darauf an:
* hash_map's sind nicht Teil der Standards und gibt es z.B. in GCC nicht. * maps sind intern sortiert (Binärbäume), hashmaps sind grundsätzlich unsortiert. * hashmaps sind theoretisch deutlich schneller als maps. D.h. * wenn Portabilität eine Rolle spielt, wirst Du deine eigene hashmap-Implementierung realisieren müssen. * wenn Sortierung/interne Ordnung eine Rolle spielt, kommen hashmaps kaum in Frage. * ob sich der Geschwindigkeitsvorteil von hashmaps gegenüber maps überhaupt auswirkt, oder ob andere Nachteile deutlich überwiegen (z.B. Portabilität/Sortierung) hängt von vielen anderen Faktoren der Anwendung ab. Ralf
Ralf Corsepius schrieb: [...]
Kleines, zusammengehacktes Beispiel, das vermutlich ziemlich genau das macht, was Du vorhast: [...] Vielen Dank für die Hilfe, das Beispiel hat mir wirklich sehr gut geholfen.
oder ob z.B. eine
besser geeignet ist? Kommt darauf an:
* hash_map's sind nicht Teil der Standards und gibt es z.B. in GCC nicht. * maps sind intern sortiert (Binärbäume), hashmaps sind grundsätzlich unsortiert. * hashmaps sind theoretisch deutlich schneller als maps.
Gibt es die
Hi, On Fri, 31 Oct 2003, Bastian Schern wrote:
* hash_map's sind nicht Teil der Standards und gibt es z.B. in GCC nicht.
Klar.
Gibt es die
auch nicht bei gcc 3.x?
Doch. Da aber nicht in ISO-C++ sind diese Klassen nicht an den
Standardstellen. Header ist woanders, Namespace is '__gnu_cxx', also:
---------
#include
Hi, On Tue, 28 Oct 2003, Bastian Schern wrote:
typedef struct flow_key_t {
s/typedef// Das ist C++.
uint32_t src_addr; uint32_t dst_addr; };
//...
int main( ... ) { map
flow_keys;
Du brauchst mind. einen operator< auf dem Indextyp. Sonst kann keine map<> implementiert werden.
Leider geht das so nicht. Ich bekomme folgende Fehlermeldung: trafana.cpp|78| error: template-argument ` || analyzeAllPackets(std::vector
&)::ltstr'
Diese Funktion z.B existiert in deinem snippet nicht.
Die Frage ist natürlich auch, ob <map> für meinen Anwendungsfall überhaupt geeignet ist oder ob z.B. eine
besser geeignet ist?
<map> ist ISO C++,
Ich denke ich werde so ca. 100000 - 1000000 werte vorhalten müssen.
Sicher, dass du von so vielen unterschiedlichen Leuten connections bekommst? Ciao, Micha.
Michael Matz schrieb: [...]
s/typedef// Das ist C++. Was meinst Du denn damit?
[...]
Du brauchst mind. einen operator< auf dem Indextyp. Sonst kann keine map<> implementiert werden. Wie implementiere ich den?
Leider geht das so nicht. Ich bekomme folgende Fehlermeldung: trafana.cpp|78| error: template-argument ` || analyzeAllPackets(std::vector
&)::ltstr'
Diese Funktion z.B existiert in deinem snippet nicht.
Ups! struct ltstr { bool operator()( flow_key_t& s1, flow_key_t& s2 ) const { return( (s1.src_addr+s1.dst_addr) < (s2.src_addr+s2.dst_addr) ); } };
Die Frage ist natürlich auch, ob <map> für meinen Anwendungsfall überhaupt geeignet ist oder ob z.B. eine
besser geeignet ist? <map> ist ISO C++,
nicht (macht aber hier nichts aus). <map> benutzt nen red-black Tree zur Implementierung, ne Hashtabelle. _koennte_ schneller sein, kommt auf die Hashfunktion und die Daten an. Ich denke ich werde so ca. 100000 - 1000000 werte vorhalten müssen.
Sicher, dass du von so vielen unterschiedlichen Leuten connections bekommst?
Ich will ja nicht meinen eigenen Rechner analysieren, sondern das OC-3 Interface eines großen Internet Provider Routers. Viele Grüße Bastian
Hi, On Tue, 28 Oct 2003, Bastian Schern wrote:
Michael Matz schrieb: [...]
s/typedef// Das ist C++. Was meinst Du denn damit?
'struct S' erzeugt (im Gegensatz zu C) sofort den Typen 'S'. Keine typedefs notwendig (du hast es ehh falsch benutzt, da du den zu definierenden Namen weggelassen hast). Also typedef loeschen.
Du brauchst mind. einen operator< auf dem Indextyp. Sonst kann keine map<> implementiert werden. Wie implementiere ich den?
Aehnlich wie Ralf.
trafana.cpp|78| error: template-argument ` || analyzeAllPackets(std::vector
&)::ltstr'
Diese Funktion z.B existiert in deinem snippet nicht.
Ups!
struct ltstr { bool operator()( flow_key_t& s1, flow_key_t& s2 ) const { return( (s1.src_addr+s1.dst_addr) < (s2.src_addr+s2.dst_addr) ); } };
Ah, das ist dein operator<. Tja, aber in dem Snippet hast du ihn nicht benutzt. Also sorry, aber mit derart downgestrippten Beispielen, die nicht kompilieren, den Fehler aber auch nicht zeigen, kann man wenig anfangen.
Ich will ja nicht meinen eigenen Rechner analysieren, sondern das OC-3 Interface eines großen Internet Provider Routers.
---> hash_map. Da musst du dann aber eben ne hash Funktion definieren. Ciao, Micha.
On Tue, 2003-10-28 at 16:31, Bastian Schern wrote:
Michael Matz schrieb: [...]
s/typedef// Das ist C++. Was meinst Du denn damit?
[...]
Du brauchst mind. einen operator< auf dem Indextyp. Sonst kann keine map<> implementiert werden. Wie implementiere ich den? Schau Dir den Code an, den ich vor ein Paar Minuten gepostet habe.
Ralf
participants (4)
-
Bastian Schern
-
Michael Matz
-
Peter Wiersig
-
Ralf Corsepius