[C] Herkomst van UDP datagrams?

Pagina: 1
Acties:

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Ik probeer een client-server systeempje te bouwen op basis van UDP messages. Bij het ontvangen van een berichtje (dat verder prima gaat) lukt het me echter niet het IP-adres en de poort van de zender van het berichtje terug te krijgen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int recv_message(int sock, struct sockaddr_in* addr, size_t* alen, message_t* msg) {
    
    int len;
    char* buffer;
    
    assert(msg != NULL);
    
    buffer = checked_malloc(BUFFER_SIZE);
    len = recvfrom(sock, buffer, BUFFER_SIZE, 0, (struct sockaddr*) addr, alen);
    if (len < 0) {
        return len;
    }
    
    DEBUG("INCOMING-FROM-ADDR: %s\n", inet_ntoa(addr->sin_addr));
    DEBUG("INCOMING-FROM-PORT: %i\n", ntohs(addr->sin_port));
    
    parse_message(buffer, len, msg);
    return 0;
    
}


Dit geeft als output:

INCOMING-FROM-ADDR: 204.40.181.191
INCOMING-FROM-PORT: 1975

Dit terwijl het bericht verzonden is vanaf localhost of 192.168.0.13:2003. Wat doe ik fout?

(Dit alles draait op Linux.)

Rustacean


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Draait alles ook op dezelfde PC? (dus zowel het versturende als het ontvangende gedeelte)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Yep. De server draait op poort 2002, de client op 2003.

Rustacean


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Luistert de client op poort 2003? Dat wil natuurlijk niet zeggen dat de client ook *verzendt* vanaf poort 2003.
En is het externe IP van die machine of van jullie firewall/router 204.40.181.191? Want standaard wordt het default uitgaande IP genomen om zaken te verzenden en dat kan ook gebeuren als je verstuurd naar 192.168.0.13.

Een "route -n" op linux of een "route print" op windows kan ook misschien het 1 en ander verklaren.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
De client luistert op poort 2003, ja.

Mijn externe IP is iets heel anders. Mijn routing table zegt:

192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

Dus dat lijkt me goed?

Ik heb trouwens zitten kijken, en dezelfde code werkt in een ander progje dat ik hiervoor geschreven had wel goed. Dat zou dus moeten betekenen dat er ergens iets misgaat met pointers enzo?

Rustacean


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Dit betekent dat alles voor 192.168.x.x naar 0.0.0.0 gaat en over eth0 naar buiten gaat. Waar gaat je 0.0.0.0 naar toe? Ook dat staat als het goed is in je route info.

Als dezelfde code ergens anders wil goed werkt dan is het misschien handig om de aanroepende code te geven.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Mijn 0.0.0.0 gaat naar de router, 192.168.0.1:

0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0

Ik ben nu met valgrind aan het kutten om te kijken of ik daar de fouten mee kan vinden, maar in principe kan je de caller vinden hier vinden, het is de handle_message() functie.

Rustacean


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien een stomme vraag, maar bind je de client wel aan een specifiek poortnummer met bind()?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
.oisyn schreef op vrijdag 13 juli 2007 @ 12:29:
Misschien een stomme vraag, maar bind je de client wel aan een specifiek poortnummer met bind()?
Ja, de client probeert zich te binden aan INADDR_ANY:2003.

Rustacean


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat moet trouwens ADDR_ANY zijn, maar ik weet niet of dat wat uitmaakt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Ik heb hier in documentatie staan dat het INADDR_ANY moet zijn... Maar het zal allebei wel neerkomen op 0. Ik was trouwens aan het prutsen met memleaks, en volgens mij lost dat ook het probleem met de herkomst-adressen op (kan het nu niet verifiëren, want heb ook weer meer kapot gemaakt).

Rustacean


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

mja, uit winsock2.h:
C:
1
2
#define INADDR_ANY              (u_long)0x00000000
#define ADDR_ANY                INADDR_ANY

:P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Nou, het probleem is opgelost. Zat hem gewoon in een heleboel brakke pointers omdat ik me nog niet echt bewust van de effecten van lokale scope op functie-niveau. :) Bedankt voor alle hulp!

Rustacean

Pagina: 1