Toon posts:

[Linux C] ping probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een programma heb ik een ping-functie nodig. Deze gemaakt en het werkt op zich maar:
* ik ping N keer hetzelfde adres in zeer korte tijd via N verschillende sockets; het enige dat verandert in dat geval is het sequence-nummer in de icmp-header
* na een select ik krijg echter alleen het eerste bericht N keer terug op alle sockets

Is dit normaal gedrag van de echo-server, of iets anders?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 10:11

pistole

Frutter

hmm, het is nog iets vroeg, maar werkt icmp wel met sockets? Ik dacht dat dat alleen voor tcp gold..
Maar goed, het is nog vroeg dus ik kan er best naast zitten ;)

Ik frut, dus ik epibreer


  • Rukapul
  • Registratie: Februari 2000
  • Laatst online: 09:27
Je bent nogal vaag in hoe je je ping geimplementeerd hebt. Ik ga er vanuit dat je een UDP ping gebruikt zoals gebruikelijk in unix implementaties (en dus niet een ICMP ping of een TCP of UDP ping geimplementeerd door gebruik te maken van een echo service).

Vraag is dan of je op verschillende poortnummers je ping uitvoert: unix ping implementaties doen dit om de pingresultaten te kunnen onderscheiden van elkaar. Wat bedoel je met 'echo server'?
OlafvdSpek schreef op 27 mei 2003 @ 10:02:
[...]

Waar ga je nu vanuit? Wel UDP of geen UDP?
Linux ping gebruikt trouwens wel ICMP en dat is ook logisch.
UDP ping. Maar een UDP ping gericht op een gesloten poort resulteert in een ICMP antwoord.
Een UDP ping op een open poort (bv een echo service) resulteert echter in een UDP antwoord.

[ Voor 32% gewijzigd door Rukapul op 27-05-2003 10:37 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Rukapul schreef op 27 May 2003 @ 09:50:
Je bent nogal vaag in hoe je je ping geimplementeerd hebt. Ik ga er vanuit dat je een UDP ping gebruikt zoals gebruikelijk in unix implementaties (en dus niet een ICMP ping of een TCP of UDP ping geimplementeerd door gebruik te maken van een echo service).
Waar ga je nu vanuit? Wel UDP of geen UDP?
Linux ping gebruikt trouwens wel ICMP en dat is ook logisch.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 27 mei 2003 @ 08:05:
Voor een programma heb ik een ping-functie nodig. Deze gemaakt en het werkt op zich maar:
* ik ping N keer hetzelfde adres in zeer korte tijd via N verschillende sockets; het enige dat verandert in dat geval is het sequence-nummer in de icmp-header
* na een select ik krijg echter alleen het eerste bericht N keer terug op alle sockets

Is dit normaal gedrag van de echo-server, of iets anders?
Zal wel een bug zijn. Kun je de code posten?

Verwijderd

Topicstarter
Sorry, het is een icmp implementatie, afgeleid van een implementatie voor het ping commando. Een udp-ping werkt (om onbekende reden) niet; dit kan aan het apparaat liggen dat ik 'ping' en daar heb ik geen invloed op; ik heb het geprobeerd op poort 7.

In hele grove lijnen (dit is geen een letterlijke kopie):
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct sock_addr_in addr[MAX];
struct protoent *proto;
int fd[MAX];
fd_set rfds;
uint8_t buffer[128];

// send a ping message on each socket
for(cnt=0;cnt<MAX;cnt++)
{
  proto=getprotobyname("icmp");
  fd[cnt]=socket(PF_INET,SOCK_RAW,proto->p_proto);
  create_ping_message(buffer);
  send_ping_message(fd[cnt],addr[cnt],buffer); // uses sendto
  FD_SET(fd[cnt],&rfds)
//  sleep(1);
}

select(.......);

for(cnt=0;cnt<MAX;cnt++)
{
  if(FD_ISSET(fd[cnt],&rfds)
  {
    // read data here using recv
  }
}
sleep(5);


Het hele verhaal hierboven gaat in een eindeloze loop. Alle adressen in addr kunnen hetzelfde zijn (hoeft niet). Uiteraard kan het wat netter geprogrammeerd worden door bij te houden welk adres al geping'ed is; de vraag is echter waarom ik op iedere socket hetzelfde antwoord krijg.
Als ik de sleep(1) toevoeg, gaat het wel goed, dan zie ik op iedere socket een ander sequence nummer. Oeps, misschien moet ik wel flushen omdat ik raw sockets gebruik? Effe proberen

edit:
Hoe flush je een socket
Shame shame shame

edit:
Volgende keer zelf even de taal aangeven in je code block ;) Zie ook de FAQ over het plaatsen code :)

Scheelt ook weer een typfoutje namelijk. 'icmp" != "icmp"

[ Voor 14% gewijzigd door drm op 27-05-2003 13:25 . Reden: [code=c] ;) ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Ehmm, raw sockets worden toch niet gebufferd?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
kenneth schreef op 27 May 2003 @ 11:17:
Ehmm, raw sockets worden toch niet gebufferd?
Had al zo'n vermoeden, kon al niet vinden hoe :'(

[ Voor 9% gewijzigd door Verwijderd op 27-05-2003 11:36 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Als je met raw sockets werkt, hoe weet de kernel dan welk packet naar welke socket moet?
Je hebt geen port nummers in ICMP.

Verwijderd

Topicstarter
8)7 OK, het probleem is opgelost. Uiteraard liet ik in m'n code niet zien dat ik de sockets ook weer sloot nadat er een antwoord was ontvangen. En dan krijg je de andere pakketten uiteraard niet meer te zien 8)7

Bedankt voor het meedenken en het 'op het goede spoor zetten'.
Pagina: 1