C-Programmierung Ping.c Socket Error 10060
-
Hi,
Ich bin gerade dabei ein kleines Programmierprojekt für die Uni fertigzustellen.
Ich habe mir ein Netzwerkanalyseprogramm vorgenommen, dass zum Beispiel die Download und Upload Geschwindigkeit misst, die Interne und Externe Ip ausgibt und unter anderem wollte ich auch eine ganz einfache und schlichte Ping Funktion einbauen. Leider stellte sich heraus, dass das nicht so einfach ist wie vorher angenommen. Ich habe, da ich noch nicht lange programmiere und von Sockets und ähnlichem sowieso keine Ahnung habe, viel in Tutorials gelesen und auch einiges daraus übernommen, jedoch funktioniert das ganze nicht wie es soll. Ich erhalte den Socket-Error 10060 der für "Connection timed out" steht, leider weiß ich nicht, was ich damit anfangen soll. Hier vielleicht erst mal der Quellcode:#include <windows.h> #include <winsock2.h> #include <stdio.h> #include <stdbool.h> #include <string.h> #define PING_RECVTIMEOUT 1000 #define NMAXLEN 5000 #define MAX_PACKET 1024 //ICMP Header 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; //IP Header typedef struct{ unsigned int h_len:4; char szAdditionalData[23]; }ip_header_t; //Prototypen int startWinsock(void); bool SetTimeOut(SOCKET sckSocket, unsigned int nTimeOut); unsigned short WriteHeader(icmp_header_t hdrICMPHeader, char *szData, unsigned short usDataLen, char *szPacket); int main(){ SOCKET s; icmp_header_t icmphdr; char szData[20], szPacket[32]; szData[20] = "Ping_Test"; unsigned short usPacketLen; struct sockaddr_in server; struct hostent *host_info; DWORD starttime, stoptime; char ip[15]; long rc; WSADATA wsa; rc = WSAStartup(MAKEWORD(2,0),&wsa); if(rc!=0){ printf("Fehler: startWinsock, fehler code: %ld\n",rc); return 1; }else{ printf("Winsock gestartet!\n"); } // Wandle den Servernamen bspw. "google.de" in eine IP-Adresse um. host_info = gethostbyname("google.de"); if (NULL == host_info){ printf("Unbekannter Server"); }else{ // Server-IP-Adresse memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length ); sprintf(ip, "%u.%u.%u.%u", (unsigned char) host_info->h_addr_list[0][0], (unsigned char) host_info->h_addr_list[0][1], (unsigned char) host_info->h_addr_list[0][2], (unsigned char) host_info->h_addr_list[0][3]); } server.sin_family = AF_INET; server.sin_port = 0; icmphdr.ucType = 8; icmphdr.ucCode = 0; icmphdr.ulTimeStamp = GetTickCount(); usPacketLen = WriteHeader(icmphdr, szData, 20, szPacket); s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(s==INVALID_SOCKET){ printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; }else{ printf("Socket erstellt!\n"); } //print Host IP printf("Hostadresse: %s\n",ip); //Timeout setzen SetTimeOut(s, PING_RECVTIMEOUT); //Paket senden sendto(s, szPacket, usPacketLen, 0, (SOCKADDR *) &server, sizeof(server)); printf("Paket gesendet!\n"); //RecvFunktion char szBuffer[MAX_PACKET]; ip_header_t *piphdr; icmp_header_t *picmphdr; icmp_header_t *pOutICMPHeader; struct sockaddr_in from; int counter = 0; while(counter < 4){ starttime = GetTickCount(); int nResponseLen = 0; int fromLen = sizeof(from); nResponseLen = recvfrom(s, szBuffer, MAX_PACKET, 0, (SOCKADDR *) &from, &fromLen); stoptime = GetTickCount(); if(nResponseLen == SOCKET_ERROR){ printf("Socket Error!Fehler: %d\n\n",WSAGetLastError()); piphdr = (ip_header_t *) szBuffer; picmphdr = (icmp_header_t *) (szBuffer + piphdr->h_len * 4); // h_len wird in doubleword's (int's) gespeichert, daher * 4 }else{ memcpy(szPacket, szBuffer + piphdr->h_len * 4 + sizeof(icmp_header_t), min(NMAXLEN, nResponseLen - piphdr->h_len * 4 - sizeof(icmp_header_t))); memcpy(pOutICMPHeader, picmphdr, sizeof(icmp_header_t)); } counter++; printf("Ping: %ldms\n\n", (stoptime - starttime)); } system("PAUSE"); return 0; } //Timeoutfunktion bool SetTimeOut(SOCKET s, unsigned int nTimeOut){ unsigned int nMillis = nTimeOut; return setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &nMillis, sizeof(nMillis)) != SOCKET_ERROR; } //Funktion zum schreiben eines ICMP Headers unsigned short WriteHeader(icmp_header_t hdrICMPHeader, char *szData, unsigned short usDataLen, char *szPacket){ memcpy(szPacket, &hdrICMPHeader, sizeof(icmp_header_t)); memcpy(szPacket + sizeof(icmp_header_t), szData, usDataLen); return usDataLen + sizeof(icmp_header_t); }
Sicher alles sehr unübersichtlich und jeder andere würde mich am liebsten erschlagen wenn er das sieht, aber vielleicht mag mir ja doch einer helfen, ich wäre zumindest ziemlich dankbar dafür!
Achso vielleicht noch kurz, was das Programm können soll:
Einfach nur die Ausgabe des Pings zu einem Host.Vielen Dank im Voraus
mavEEE