2016-05-05 23 views
0

Ich lerne über die Ping-Implementierung in C. Das Problem ist, dass ich eine rohe Sockets verwendet, um das Paket zu empfangen. Für alle Pakete haben wir einen Identifikationswert in ICMP header.Warum empfängt Ping ein weiteres Ping-Befehlspaket?

Ich lief die ping in mehreren Terminals.

Zum Beispiel lief ich drei ping google.com in drei Terminals.

Zum ersten ping des Identifizierungswert 23456, der zweite Identifikationswertes Ping 34564 und der dritte ping Identifikationswert ist 98763.

Mein Problem ist der zweite Tisch haben zur Identifizierung mit 34564 Paket empfängt, aber er erhält den Identifikationswert als 23456.

Für jeden Ping wird der neue Raw-Socket erstellt. Aber es empfängt ein weiteres Ping-Paket.

Kann mir bitte jemand erklären, warum er ein weiteres Ping-Paket erhält?

UPDATE: -

Ich habe noch einen Zweifel. Der Zweifel ist,

rohe Sockets liest das Paket von wo und wie es das Paket für diesen rohen Sockel identifizieren?

UPDATE 1: -

Hier ist der Link für die Codes.

ping_common.c

ping.c

ping.h

+3

Obwohl ich versuchte, konnte ich nicht ein Problem in der ungebuchte Code erkennen Sie ausführen. – WhozCraig

+0

Es ist im Antwortpaket geschehen. Mit Recvmsg empfing ich Paket. Nach dem recvmsg, bei dem ich die Pakete validierte, wird der Identifikationswert bei der Validierung geändert. –

+0

@suresh: Danke für Infos. Jetzt zeigen Sie uns bitte einen Code .. – sjsam

Antwort

3

Was ist Sie ist von Entwurf der Raw-Socket zu sehen, weil Raw Sockets alle Rohpakete erhalten sollen. Um nur die Antwort auf bestimmte ICMP-Pakete zu erhalten, müssen Sie Filter auf den Socket anwenden. Zuerst können Sie ICMP_FILTER Socket-Optionen verwenden zu beschränken Empfang bestimmter ICMP-Typen:

struct icmp_filter filter; 
filter.data = <bit mask of ICMP types, like ICMP_REPLY>; 
setsockopt(sock, SOL_RAW, ICMP_FILTER, &filter, sizeof filter) 

Zweitens können Sie Socket-Filter anbringen nur das Paket mit der angegebenen ICMP-ID erzwingen erhalten:

struct sock_fprog filter; 
// set filter to check ID with your own ID 
setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof filter); 
+0

Wenn ich zwei Ping ausführen, wie viele rohe Sockets werden dann erstellt? –

+0

@suresh Zwei rohe Sockets werden für zwei Pings erstellt. – fluter

+0

Die rohen Sockets prüfen keine Bedingung wie liest nur die Pakete für diesen Socket? –

1

zu beantworten Ihre anderen Zweifel:

  • rohe Sockets liest das Paket von wo und wie es das Paket für diesen rohen Sockel identifizieren?
  • Raw Socket sitzen Seite andere Protokollhandler nach IP-Schicht. Aus dem Buch "Grundlegendes zu Linux-Netzwerkinterna" Kapitel 25.5:

    Hier sind einige Beispiele von Wechselwirkungen zwischen den Protokollen:

    IP-Protokoll

    Die ip_local_deliver_finish Routine, 24 in Kapitel beschrieben, liefert Eindringen ICMP-Nachrichten an die von registriert Routine icmp_rcv erhalten die ICMP-Protokoll, aber es liefert sie auch an die rohen IP-Sockets , die gegen das ICMP-Protokoll registriert sind (raw_v4_input).

    enter image description here

    Verwandte Themen