Avatar billede evilfish Nybegynder
30. oktober 2008 - 13:45 Der 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:

void TcpPacketObserver::TcpSession::setLastLocalSeq(u_int value)
{
    lastLocalSeq = value;
}

lastLocalSeq er den private værdi i objektet.

Måden jeg kalder denne metode på er således:

session.setLastLocalSeq(tcp->th_seq);

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?
Avatar billede arne_v Ekspert
30. oktober 2008 - 14:15 #1
Der er en fejl et sted i din kode. Check din memory allokering inkl. copy constructor
og assignment operator, retur vaerdier fra metoder etc..
Avatar billede segmose Nybegynder
30. oktober 2008 - 14:19 #2
Hej
  Der kan jo være mange muligheder (da jeg ikke lige kan gennemskue dit program).

Multi thread mangler mutex.
din session er ikke den rigtige.
din debugger er åndsvag.
etc.

får du ikke en klage her

session.setLastLocalSeq(tcp->th_seq);

da værdien er const (tcp er en pointer til en const) og din definition er

setLastLocalSeq(u_int value);

ikke const, lav den om til

setLastLocalSeq(const u_int value);

Du kan også give dine sessesions en id til at starte med så du kan se om du retter den samme igen.
Avatar billede evilfish Nybegynder
30. oktober 2008 - 14:39 #3
Jeg kigger på det og vender tilbage.
Avatar billede evilfish Nybegynder
31. oktober 2008 - 12:50 #4
Jeg gennemgået min kode grundigt, og debugget med et inplementeret et sessions ID, så jeg kunne følge  med i hvad der skete.

Jeg har stadig samme fejl som sidst.

Jeg har dog et opfølgende spørgsmål.

Som sagt er min structs const.
Den værdi som jeg vil trække et sekvens nummer ind i er en u_int. og er defineret således: u_int lastLocalSeq;

Når jeg trækker et sekvens nummer ud via tcp->th_seq og ind i min u_int, kommer const attributten med over i u_int variablen?
Avatar billede evilfish Nybegynder
31. oktober 2008 - 14:01 #5
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?
Avatar billede segmose Nybegynder
31. oktober 2008 - 15:43 #6
når du debugger så prøv at sammenligne adresserne på dine sessions og chekc om det reelt er 3 forskellige eller nr. 1 og 3 er den samme.

Hvordan set din allockering af session ud?

Er det C++?
hvad har du så af constructor / copy constructor?
lav en privat copy constructor for at forhindre griseri.
Avatar billede evilfish Nybegynder
03. november 2008 - 08:19 #7
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?
Avatar billede arne_v Ekspert
03. november 2008 - 22:04 #8
Hvad har du ændre vektoren til ?

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.
Avatar billede evilfish Nybegynder
04. november 2008 - 08:44 #9
unskyld skrev forkert. Den er blevet ændret til <TcpSession*> array
Avatar billede segmose Nybegynder
04. november 2008 - 09:35 #10
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.
Avatar billede evilfish Nybegynder
05. november 2008 - 08:59 #11
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
Avatar billede arne_v Ekspert
06. november 2008 - 04:10 #12
svar
Avatar billede segmose Nybegynder
09. november 2008 - 00:52 #13
ok,held og lykke med det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester