Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 812
Jeg skulle gjerne ha tatt vare på en sockaddr_in som jeg mottar i en recvfrom().

Slik har jeg det nå:
Del 1:

Kode

int bytes = recvfrom(socketd,(char *)&tp, ts, 0, (SOCKADDR *)&temp_addr, &addr_len);
spiller[nextPlayer].nett = temp_addr; // der spiller[nextPlayer].nett  er av typen sockaddr_in
del2:

Kode

for(int i = 1; i<nextPlayer; i++) {
   sendto(socketd, (char *)&tp, sizeof(tp), 0, (SOCKADDR *)&spiller[nextPlayer].nett, sizeof(spiller[nextPlayer].nett));
}
Del 1 og Del2 kjører i forskjellige tråder.

Det som ser ut til å skje, er at i recive-tråden min så er inet_ntoa(spiller[nextPlayer].nett.sin_addr) Lik den riktige ipadressen, den fikk pakke fra. Men når jeg i den andre tråden skal sende svar tilbake, så er inet_ntoa(spiller[nextPlayer].nett.sin_addr) lik 205.205.205.205 uansett.

Det hele virker som om sockaddr_in'n som jeg mottar ikke blir tatt vare på.

Noen tips på en evt løsning? (Har kansje troen på at det er noe med pekeren til sockaddr_in'n som blir mottatt, men har prøvd å memcpy'e structen inn til en annen peker (som har allokert nok minne-plass))
Bruker du fork()? Hvis du forker av en ny prosess lager du en kopi av alle dine datastrukturer for hver prosess og vil effektivt jobbe i forskjellige minnesegmenter. En løsning på dette er diverse former for IPC, alternativt kan du sette opp delt minneområde.
iTroll's Avatar
Trådstarter
39 0
Sitat av jallamann
Bruker du fork()?.
Vis hele sitatet...
Bruker CreateThread(). (Dette spillet skrives på windows)
Blir det samme med forskjellige minne områder da?
Dessverre har jeg ikke brukt CreateThread da jeg stort sett jobber med POSIX-systemer, men du skal ikke se bort i fra det. Sjekk MSDN.
▼ ... over en måned senere ... ▼
CreateThread lar deg oppgi en callback-funksjon som blir slengt ut i en egen tråd. Det er vel nærliggende å tro at denne tråden får sin egen stack og alt det der.

Edit: en mulig løsning på problemet kan være å legge spillerinfoen inn i en klassevariabel (public static PlayerInfo::setIp(int playerId, PlayerIP &ip) eller ett eller annet slikt, jeg husker ikke cpp syntax så godt lenger).
Sist endret av oracel; 11. juli 2005 kl. 13:23.
lol... Jeg skjønte hva problemet var før jeg leste koden.

sendto(socketd, (char *)&tp, sizeof(tp), 0, (SOCKADDR *)&spiller[nextPlayer].nett, sizeof(spiller[nextPlayer].nett));

bytt ut nextPlayer med i så skal det funke.

Scha
Sist endret av Scha; 11. juli 2005 kl. 13:41.
iTroll's Avatar
Trådstarter
39 0
Sitat av Scha
lol... Jeg skjønte hva problemet var før jeg leste koden.

bytt ut nextPlayer med i så skal det funke.

Scha
Vis hele sitatet...
Jau, jeg fant ut av det etterhvert, følte meg passelig dum når jeg selv så det etter ca 5-6 dager med leting etter feil :P