Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

11

22.01.2007, 22:41

zu den Strings:
Die Strings sind Bestandteil der STL und liegen im Namensraum std. Mit den Klassen wstring und string kann man komfortabel Strings manipulieren.

string ist ein typedef für basic_string<char>. Strings sind in der STL nur über eine Template Klasse basic_string definiert.


Dein Problem Dollar ist, das du IP_Input zwar einliest, das falsch (eine IP ist keine Zahl wie 6, sondern ein String der folgende Form hat: xxx.xxx.xxx.xxx

Desweiteren sendest du an die Komsole immer, egal was du eingibst "ping(IP_INPUT)". Du willst aber "ping 127.0.0.1 " z.B. Senden.

Nox's Lösung funktioniert, aber wie da steht ist es Pseudocode, also man kann ihn nicht abkopieren, sondern erst mal einige Fehler rausmachen. Er zeigt Dir aber wie es prinzipiell funktioniert.

Zu Toxie's Code:
Sehr schön in reinem Cpp geschriebem.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
  std::basic_string<char> ip;

    std::cout << "IP: ";
    std::cin >> ip;

    std::basic_string<char> cmd("ping ");
    cmd.append(ip);

    ::system(cmd.c_str());

    //Verhindern das sich die Konsole wieder schließt


zuerst String namens IP erstellen, dort Eingabe reinlesen. Einen zweiten String erstellen (cmd), der "ping " enthalten soll. Dann an den zweiten den ersten hängen. (apppend). Und damit zur Konsole....

ToxiCore

Treue Seele

Beiträge: 131

Beruf: Student

  • Private Nachricht senden

12

22.01.2007, 22:52

Zitat von »"dollar"«


Wäre es noch möglich das du deinen Quellcode ein bissl erläuterst damit ich weiss was ich da gemacht habe! Damit ich es für die Zukunft selber kann.


Habs oben editiert.

13

23.01.2007, 15:32

danke meine frage wurde gut beantwortet und ich hab auch verstanden wie es geht xD

thanks

dollar

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

23.01.2007, 15:41

Zitat von »"dollar"«

danke meine frage wurde gut beantwortet und ich hab auch verstanden wie es geht xD

thanks

dollar


Jetzt solltest du nurnoch den system Aufruf entfernen und direkt das ICMP Protokoll verwenden und schon ist es wirklich gut gelöst! :P
@D13_Dreinig

15

23.01.2007, 15:45

Wenn ich wüsste was ICMP-Protokoll ist dann ja


ach nochmal eine frage!

warum verwendet ihr:

C-/C++-Quelltext

1
std::cout << "Hallo!" << endl;

und nicht einfach

C-/C++-Quelltext

1
cout << "Hallo!" << endl;

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

23.01.2007, 15:51

Zitat von »"dollar"«

Wenn ich wüsste was ICMP-Protokoll ist dann ja


Das Protokoll welches vom Programm ping verwendet wird. Google sollte da genug finden!

Zitat von »"dollar"«


ach nochmal eine frage!

warum verwendet ihr:

C-/C++-Quelltext

1
std::cout << "Hallo!" << endl;

und nicht einfach

C-/C++-Quelltext

1
cout << "Hallo!" << endl;


Ganz einfach, weil using namespace std vermieden werden sollte. Es untergräbt nämlich ganz einfach den Sinn von Namespaces.
In deinem Beispiel ist das zwar nich sehr tragisch, aber man muss sich sowas auch nicht unbedingt angewöhnen.
@D13_Dreinig

17

23.01.2007, 17:50

Zitat von »"dollar"«

Wenn ich wüsste was ICMP-Protokoll ist dann ja

Zitat von »"www.c-worker.ch"«


3. Das ICMP Protokoll

Auf das schon oben erwähnte ICMP Protokoll soll hier näher eingangen werden. Das Internet Protocol (IP) wird für Host zu Host Kommunikation in einem System von zusammengeschloßenen Netzwerken (zum Beispiel das Internet), Catenet genannt (siehe IEN 48), genutzt. Die Elemente, die zwei Netzwerke dieses Systems verbinden, werden Gateway genannt, diese kommunizieren wegen Kontrollfragen über das Gateway-to-Gateway Protocol (GGC). Gateway kann jeder Computer sein, der an zwei Netzwerke angeschloßen ist, da das ICMP schon im Kernel aller netzwerktauglichen Betriebssysteme implementiert ist und auch nicht abgeschaltet werden kann. Eine Ausnahme bilden hier Firewalls, welche die ICMP Pakete abblocken, bevor diese zum Kernel gelangen. Kommt es jedoch zu einem Fehler, der einen Host betrifft, wie zum Beispiel "Host Unreachable", würde es wenig Sinn machen, den zum fehlerverursachenden Host nächsten Gateway zu benachrichtigen. Für solche Gateway zu Host Verbindungen wurde das Internet Control Message Protocol (ICMP) eingeführt. Mittels des ICMP können auch zwei Hosts miteinander kommunizieren, um zum Beispiel die Verbindungsgeschwindigkeit festzustellen ("Ping"). Jedoch wurde das ICMP nicht entwickelt, um zuverläßig Daten zu übermitteln, vielmehr um ein Feedback zu liefern. Damit ein Host nicht mit Fehlermeldungen überhäuft wird, werden keine Statusmeldungen über ICMP Pakete gesendet. Weiterhin werden ICMP Pakete nur für das nullte Fragment eines Datagramms gesendet (betrf. Fragmentierung von Datagrammen, siehe RFC 791).
Das ICMP baut sich aus einem IP Header und einem Direkt folgendem ICMP Header auf. Der Protocol Wert des IP Header wird auf 1 für ICMP gesetzt, sonst gibt es an diesen IP Header nichts besonderes. Der darauf folgende ICMP Header baut sich wie folgt auf:

Quellcode

1
2
3
4
5
6
7
8
9
typedef struct
{
 unsigned char ucType // ICMP Message Typ 
 unsigned char ucCode // Message Interner (Fehler-)Code 
 unsigned short usCheckSum   // Checksum für das ICMP Paket 
 unsigned short usID // ID des Pakets, oft wie Port bei TCP / UDP genutzt 
 unsigned short usSequence // Sequenznummer, bei mehreren typgleichen, (sinn-)zusammenhängenden Paketen 
 unsigned long ulTimeStamp // Zeitstempel beim Abesenden 
} icmp_header_t;

Die sogenannte Checksum ist ein Wert der zur Fehlerfeststellung innerhalb eines Datagramms fungiert. Er wird erstellt, in dem man das zu versendende Datagramm erstellt und die Checksum auf null stellt. Nun kann die eigentliche Checksum berrechnet werden, indem man als erstes einen unsigned short erstellt und in einem Schleiffendurchlauf mit dem aktuellen Wert des Puffers addiert. Nun wird der Zeiger auf den Puffer incrementiert. Wenn die Länge des Puffer ungerade ist (d.h. aus dem letztem byte kann kein short gebildet werden), wird eine 0 ans Ende angefügt. Am Ende wird sie mit ihrem 16-Bit Wert addiert. Da dies ein wenig schwierig ist zu verstehene, hier das ganze als Funktion. Das Wissen des berrechnens der Checksum ist nicht elementar, d.h. folgender Code kann einfach übernommen werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned short Checksum(unsigned short *p_usBuffer, int iSize)
{
  unsigned long lCheckSum = 0;

  while(iSize > 1)
  {
    lCheckSum += *p_usBuffer++;
    iSize -= sizeof(unsigned short);
  }

  if(iSize)
    lCheckSum += *(unsigned char*)p_usBuffer; // + 0 entfällt, da überflüßig


  lCheckSum = ((lCheckSum >> 16) + (lChecksum & ffff)) + (lCheckSum >> 16);
  return (unsigned short)(~lCheckSum);
}

Hier nun eine Liste der Nachrichten die ICMP unterstüzt:

a. Echo Request

ucType: 8, ucCode: 0
Die Echo Request Nachricht wird an einen anderen Host oder Gateway gesendet, damit dieser die angehängten Daten unveräandert zurücksendet. Dies wird genutzt um einen Computer zu "pingen", d.h. die Zeit zu ermitteln, die ein Paket bestimmter größe zum Ziel-Host braucht. Nach dem Header folgen die Daten die zurückgesendet werden sollen.
Um beispielsweise einen Computer mit einem 32 byte großen Datenpaket zu pingen, sendet man den Header plus 32 - 12 (größe des ICMP Headers) = 20 byte beliebigen Daten. Ausgewertet wird die Zeit, indem man die Milisekunden vom Absenden des Packets bis zur Antwort misst. Von der Verwendung des Timestamp Feldes der ICMP Header ist dringend abzuraten, da dieses von der Systemzeit des Ziel-Host abhängig ist. Folgendes Beispiel: Ein User in Berlin / Deutschland pingt einen Computer in Shanghai / China. Die Differenz von Timestamp und Systemzeit ist negativ, da man in China mit der Zeit "in der Zukunft ist", das ganze wird jedoch mit unsigned longs berrechnet. Das hat zur Folge das eine Ping-Zeit von bis zu mehreren Jahren errechnet werden kann.


http://www.c-worker.ch/tuts/raw_icmp.php

18

23.01.2007, 19:32

danke chriss, aber ich denke ich werde mir auf der seite die du gelinkt hast mir erst mal die ganzen tut's vorher durchlesen da ich erst Heiko's Buch durchhabe und an David's Buch grade drann bin

Werbeanzeige