30. oktober 2008 - 13:45Der er
11 kommentarer og 2 løsninger
Kopiering fra en const struct fejler (måske)
Hej eksperten.
Jeg er igang med at lave et program som skal tracke TCP sessioner, og se om der kommer pakke retransmission på de sessioner. Det betyder jeg sidder og arbejder med acknowledge og seqence numrer.
Jeg trækker informationen ud via pcap. Dette gøres vha structs. Disse structs er defineret således (viser kun tcp):
const struct sniff_tcp *tcp;
Informationen bliver også lagt fint ind i strukturerne, og jeg kan validere flere ting via dataen.
Nu kommer så problemet:
Jeg oprette en masse session objekter til hver en session som TCP'en opretter. I dem skal de have SEQ og ACK fra den sidste TCP struct. Derfor har jeg lavet en række set og get metoder til dette. Disse ser således ud:
tcp er den struct som forklaret i starten. th_seq er SEQ nummeret i structen.
Så kommer det jeg ikke forstår. Jeg her debugget som en sindsyg og fundet ud af at første gang jeg kalder metoden bliver værdien lagt ind. Den næste gang en ny værdi kommer ind, bliver den også lagt ind. Men næste gang en ny værdi igen kommer ind, har værdien skiftet til den første værdi igen. Hvordan?
En anden ting. De objekter som holder øje med en session afgangen er inner class til det objekt der analysrer pakkerne der kommer ind via pcap. Kan det have nogen betydning?
Jeg har løst mit problem, men aner ikke helt hvorfor det virker. Måske kan i fortælle mig hvad der kunne være problemet. Problmet var ikke adgangen, men oprettelsen af mine TcpSession objekter
Før jeg fik løst problemet har jeg oprettede jeg dem således: TcpSession session; Jeg lagde dem ind i en vektor som jeg oprettede således: vector<TcpSession> array;
Nu har jeg oprettet dem således: TcpSession * session = new TcpSession(); og ændret vektoren til: vector<TcpSession> array;
Jeg ved godt hvad forskellen på dem er, og hvorledes de lægges i memory'en. Men hvorfor virker det nu og ikke før. Nogen forklaring på dette?
Mit gæt er at du før havde vector<TcpSession> og at du nu har vector<TcpSession> og at du enten mangler eller har en fejlagtig copy constructor og assignment operator.
Hvis det skyldes noget copy/assign/default constructor problem så se efter om du har nogen constructor af nogen art og om de tager hånd om referancer og pointerer. Hvis du ikke har nogen må du hverken have referancer eller pointerer i session.
I dit exemple før genbrugte du samme object, i det nye fik du et frisk constructet hver gang, kan der være noget uninitialiseret data?
Jeg ville gerne se noget mere kode for at kunne sige mere, herunder hvor du tildeler værdier til TcpSession, hvor du assigner TcpSession til din vector, erklæringen af TcpSession.
Jeg tror egentlig ikke der er nødvendighed for at grave mere ind i problemet. Har gennemtestet systemet, og der er ingen (alvorlige) fejl. Nu skal det bare justeres så det passer perfekt. Men I to (segmose og arne_v) skal have tak fordi i gad hjælpe. Det er jeg meget taknemmelig for. Smid lige et svar. Velfortjente point
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.