Befehl wie z.b ping in c++ ...
-
Hi !
Wollte mal fragen ob es in C++ einen Befehl gibt der das gleiche macht wie
ping. Sowas in der Art ....//main.cpp #include <iostream> #include <stdlib.h> using namespace std; int main() { if(!system("ping www.gamigo.de > nul")) { cout << ("www.gamigo.de ist Online"); } else{ cout << ("www.gamigo.de ist Offline"); } return 0; }
Möchte gerne ein Ping-Tool schreiben .... desswegen meine Frage
THX für alle antworten
MFG
-
Hallo,
Nope sowas gibt es nicht in c++. Da musst du dich an die Socketapi deiner Wahl wenden. C++ kennt eben ströme, so ein strom kann auch ein Socket sein. Und ping schickt eine bestimmte Art von string über den Socket und liesst dann die antwort.
Du packst halt nen icmp-echoreq packet auf deinen socket. Naja gibts ne Menge tuts zu. google ist dein Freund.
-
Hallo,
ne, sowas gibts nicht. Du musst dir das schon selber zusammenzimmern, je nach Betriebsystem. Es gibt genügend Tutorials zur Netzwerkprogrammierung:
http://www.c-worker.ch/
http://www.ecst.csuchico.edu/~beej/guide/net/html/Ich glaub irgendwo da wird auch nen Ping Befehl nachgebaut. Ansonsten einfach mal gucken, gab schon einige Threads diesbezüglich.
-
Hi
hm schade ...
Danke für die Info ! Werd mir die Links jetzt mal ankucken.MFG
-
schau dir das programm mal an:
/****************************************************************************** Programm: Ping -------------- Man kann einen Server anpingen und schauen ob er antwortet: Es werden default 4 Datenpakete gesendet an den Server, der Server antwortet falls er erreicht werden kann, mit 4 Datenpakete zu je 64 Bytes zurück. Allgemeines zu ICMP: -------------------- Echo Request, Echo Reply ------------------------ Diese Meldungen dienen zur Überprüfung ob ein Ziel erreichbar und aktiv ist. Der Sender des Echo Request wartet auf eine Echo Reply Message, die er nur erhält, wenn der Zielrechner aktiv ist. Als ICMP Typ wurde die Nummer 8 für den Request und 0 für den Echo Reply definiert. Der Code ist in beiden Fällen auf 0 gesetzt. Außerdem ist ein ICMP Echo Identifikator definiert, welcher vom Sender des Datagramms erzeugt wird und zur Identifikation des Prozesses dient. Der Empfänger schickt den Reply an diesen Port. Eine Echo Sequenz Nummer wird zur fortlaufenden Numerierung des Datagramms genutzt. Der Empfänger nutzt die Nummer bei der Antwort und ermöglicht dem Sender des Echo Request die Überprüfung der Richtigkeit der Antwort. Die ICMP Echo Daten enthalten einen Echo String, der vom Empfänger an den Sender zurückgeschickt wird. Destination Unreachable ----------------------- Diese Nachricht wird an den Sender des Datagramms geschickt, wenn ein Subnetzwerk oder Router den Zielrechner nicht erreichen kann oder das Paket nicht ausgeliefert werden kann weil das Don´t Fragment Bit gesetzt ist und das Paket für ein Netzwerk zu groß ist. Die Nachricht wird vom Router generiert sofern es sich um ein nicht erreichbares Netzwerk oder einen unerreichbaren Zielrechner handelt. Sollte es sich jedoch um einen unerreichbaren Port handeln so schickt diese Meldung der Zielrechner. ICMP Typ Zur Unterscheidung der einzelnen ICMP Meldungen wurden ICMP Nummern definiert. Die Destination Unreachable Meldung hat die Nummer 3. ICMP Code Der ICMP Code teilt dem Sender mit, weshalb sein Datagramm nicht übermittelt werden konnte. Es sind die folgenden Destination Unreachable Codes definiert: 0= Netz nicht erreichbar 1= Rechner nicht erreichbar 2= Protokoll nicht erreichbar 3= Port nicht erreichbar 4= Fragmentierung notwendig, jedoch nicht möglich wegen gesetztem DF Bit 5= Source Route nicht erreichbar ******************************************************************************/ #include <windows.h> #include <stdlib.h> #include <string> #include <sstream> #include <iostream> #include <stdio.h> #include <iostream.h> using namespace std; #define ICMP_ECHOREPLY 0 #define ICMP_UNREACHABLE 3 #define ICMP_ECHO 8 // 0 = Netz nicht erreichbar #define ICMP_CODE_NETWORK_UNREACHABLE 0 // 1 = Rechner nicht erreichbar #define ICMP_CODE_HOST_UNREACHABLE 1 // Minimalgrösse 8 Byte #define ICMP_MIN 8 #define STATUS_FAILED 0xFFFF #define DEF_PACKET_SIZE 32 #define MAX_PACKET 65000 /* Der IP Header: -------------- | Byte 0 | Byte 1 | Byte 2 | Byte 3 | 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ struct IP_HEADER { unsigned int h_len:4; // Länge des Headers unsigned int version:4; // IP Version unsigned char tos; // Type of service unsigned short total_len; // Gesamt länge des Pakets unsigned short ident; // unique identifier unsigned short frag_and_flags; // flags unsigned char ttl; // TTL unsigned char proto; // Protokoll (TCP, UDP etc) unsigned short checksum; // IP Checksumme unsigned int sourceIP; // Source IP unsigned int destIP; // Ziel IP }; /* Der ICMP Header: ---------------- | Byte 0 | Byte 1 | Byte 2 | Byte 3 | 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | ICMP Header Prüfsumme | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Identifikatior |Sequenz Nummer | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ struct ICMP_HEADER { char i_type; // Type char i_code; // Code unsigned short i_cksum; // Prüfsumme unsigned short i_id; // Identifikatior unsigned short i_seq; // Sequenz Nummer unsigned long timestamp; // Um die benötigte Zeit zu messen }; long WinsockStartup(); void FillIcmpData(char* icmp_data, int datasize); unsigned short checksum(unsigned short *buffer, int size); void DecodeResponse(char *buf, int bytes, SOCKADDR_IN *from); // Für Messagebox Ausgabe ostringstream os; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIsntance, LPSTR lpCmdine, int nShowCmd) { //WNDCLASS WndClass; //HWND hWnd; SOCKET sockRaw; SOCKADDR_IN addrDest; SOCKADDR_IN addrFrom; int addrFromLen = sizeof(addrFrom); HOSTENT* ptrHostent; unsigned long datasize; int RecvTimeout = 1000; char *dest_ip; char *icmp_data; char *recvbuf; unsigned int addr=0; unsigned short seq_no = 0; int BytesReceived; int BytesSent; long rc; unsigned ping_anzahl=0; // Die IP fuers anpingen: http://suse.de const char* ip="195.135.220.3"; rc = WinsockStartup(); if (rc == SOCKET_ERROR) { os << "Error: WinsockStartup failed: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return SOCKET_ERROR; } sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockRaw == INVALID_SOCKET) { os << "Error: Cannot create Socket: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return SOCKET_ERROR; } rc = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&RecvTimeout, sizeof(RecvTimeout)); if(rc == SOCKET_ERROR) { os << "Error: Cannot set Recv Timeout: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return SOCKET_ERROR; } // Ip Adresse in ptrHostent geben ptrHostent = gethostbyname(ip); if ((!ptrHostent) && (addr == INADDR_NONE) ) { os << "Error: Cannot resolve Host: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); return SOCKET_ERROR; } if (ptrHostent != NULL) { memcpy(&(addrDest.sin_addr),ptrHostent->h_addr, ptrHostent->h_length); } else { addrDest.sin_addr.s_addr = addr; } if (ptrHostent) { addrDest.sin_family = ptrHostent->h_addrtype; } else { addrDest.sin_family = AF_INET; } // Konvertiert eine Netzwerk Adresse (SOCKADDR_IN) in einen String im Punkt Format (x.x.x.x) dest_ip = inet_ntoa(addrDest.sin_addr); // Gröss des Datenpaketes datasize = 32; if (datasize == 0) { datasize = DEF_PACKET_SIZE; } if (datasize > MAX_PACKET) { os << "Error: Data size more then " << MAX_PACKET << " Bytes or less then 0 Bytes"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); os << "I'll take the default size..."; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); datasize = DEF_PACKET_SIZE; } datasize += sizeof(ICMP_HEADER); icmp_data = (char*)malloc(MAX_PACKET); recvbuf = (char*)malloc(MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); if (!icmp_data || !recvbuf) { os << "Error: Not enough Memory: " << GetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return 0; } FillIcmpData(icmp_data,datasize); os << "Ping wird ausgefuehrt fuer " << ip << " mit " << datasize << " Bytes Daten"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); while(ping_anzahl<4) { ((ICMP_HEADER*)icmp_data)->i_cksum = 0; ((ICMP_HEADER*)icmp_data)->timestamp = GetTickCount(); ((ICMP_HEADER*)icmp_data)->i_seq = seq_no++; ((ICMP_HEADER*)icmp_data)->i_cksum = checksum((unsigned short*)icmp_data, datasize); BytesSent = sendto(sockRaw,icmp_data,datasize,0,(SOCKADDR*)&addrDest, sizeof(addrDest)); if (BytesSent == SOCKET_ERROR) { if (WSAGetLastError() == WSAETIMEDOUT) { os << "Zeitueberschreitung der Anforderung."; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); //continue; } os << "sendto failed: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return 0; } if (BytesSent < datasize ) { os <<"Wrote " << BytesSent << " bytes"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); } BytesReceived = recvfrom(sockRaw,recvbuf,MAX_PACKET+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),0,(SOCKADDR*)&addrFrom, &addrFromLen); if (BytesReceived == SOCKET_ERROR) { if (WSAGetLastError() == WSAETIMEDOUT) { os << "Zeitueberschreitung der Anforderung."; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); //continue; } os << "recvfrom failed: " << WSAGetLastError(); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return 0; } DecodeResponse(recvbuf,BytesReceived,&addrFrom); Sleep(1000); ping_anzahl++; } return 0; } /* Die Antwort die wir empfangen ist ein IP Paket. Wir müssen nun den IP Header decodieren um die ICMP Daten lesen zu können */ void DecodeResponse(char *buf, int bytes, SOCKADDR_IN *from) { IP_HEADER *IpHeader; ICMP_HEADER *IcmpHeader; unsigned short IpHeaderLen; IpHeader = (IP_HEADER*)buf; IpHeaderLen = IpHeader->h_len * 4 ; // number of 32-bit words *4 = bytes if (bytes < IpHeaderLen + ICMP_MIN) { os << "Too few bytes from " << inet_ntoa(from->sin_addr); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); } IcmpHeader = (ICMP_HEADER*)(buf + IpHeaderLen); if (IcmpHeader->i_type != ICMP_ECHOREPLY) { if (IcmpHeader->i_type == ICMP_UNREACHABLE) { os << "Reply from " << inet_ntoa(from->sin_addr); MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); if(IcmpHeader->i_code == ICMP_CODE_HOST_UNREACHABLE) { os << ": Destination Host unreachable !"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return; } if(IcmpHeader->i_code == ICMP_CODE_NETWORK_UNREACHABLE) { os << ": Destination Network unreachable !"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return; } } else { os << "non-echo type " << (int)IcmpHeader->i_type <<" received"; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return; } } if (IcmpHeader->i_id != (unsigned short)GetCurrentProcessId()) { os << "someone else's packet!" << endl; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); return; } os << "Antwort von " << inet_ntoa(from->sin_addr) << ": " << "Bytes=" << bytes; os << " Zeit=" << GetTickCount()-IcmpHeader->timestamp << " ms"; os << " TTL=" << static_cast<int>(IpHeader->ttl); os << " Icmp_Seq=" << IcmpHeader->i_seq; MessageBox(NULL, os.str().c_str(), "info", MB_OK | MB_ICONINFORMATION); os.str(""); } unsigned short checksum(unsigned short *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(unsigned short); } if(size) { cksum += *(unsigned char*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (unsigned short)(~cksum); } /* Hilfs Funktion um unseren ICMP Header zu füllen */ void FillIcmpData(char * icmp_data, int datasize){ ICMP_HEADER *icmp_hdr; char *datapart; icmp_hdr = (ICMP_HEADER*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_id = (unsigned short)GetCurrentProcessId(); icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(ICMP_HEADER); // Den Buffer mit etwas füllen memset(datapart,'C', datasize - sizeof(ICMP_HEADER)); } long WinsockStartup() { long rc; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 1); rc = WSAStartup( wVersionRequested, &wsaData ); return rc; }
-
Hi
oh schaut ganz schön komplex aus .danke für den quellcode... dann werd ich mich
dann mal rein arbeiten ....
Ist es auch möglich das so umzuschreiben das ich die adresse die angepingt
werden soll eingeben kann ? wie könnte man dies am besten anstellen ?THX für alle antworten
-
Woher ist der Code, helper?
Ich habe einen ganz aehnlichen bei c-worker.ch gefunden, aber er ist nicht identisch.
-
der code is von mit, hab ich auf meine bedürfnisse optimiert!!
cu
-
helper == surf.