ICMP Packet versenden
-
Hallo alle
Ich bin ein Anfänger in Socketprogrammierung, und habe das folgende Problem.
Ich versuche ein Programm zu schreiben, das ein ICMP_ECHO Request schickt und auf einen Reply wartet. Bis jetzt funktioniert es aber nur zwischen meinen beiden WNICs (auf meinem Desktop habe ich 2 Wlan Karten), aber wenn ich versuche, mich mit einem anderen Rechner zu kommunizieren, funktioniert es leider nicht (Timeout bei recvfrom()).if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1) { perror("socket"); exit(EXIT_FAILURE); } /* * here the icmp packet is created * also the ip checksum is generated */ icmp->type = ICMP_ECHO; icmp->code = 0; icmp->un.echo.id = 0; icmp->un.echo.sequence = 0; icmp->checksum = 0; icmp->checksum = in_cksum((unsigned short *) icmp, sizeof(struct icmphdr)); ip->check = in_cksum((unsigned short *) ip, sizeof(struct iphdr)); struct sockaddr_in connection; connection.sin_family = AF_INET; connection.sin_addr.s_addr = inet_addr(dst_addr); struct timeval timeout; timeout.tv_sec = 3; timeout.tv_usec = 0; if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1) { perror("setsockopt (SO_RCVTIMEO)"); exit(1); } /* *now the packet is sent */ sendto(sockfd, packet, ip->tot_len, 0, (struct sockaddr *) &connection, sizeof(struct sockaddr)); /* *now we listen for responses */ addrlen = sizeof(connection); if (recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *) &connection, &addrlen) == -1) { perror("recv"); } else { printf("Received %d byte reply from %s:\n", sizeof(buffer), dst_addr); ip_reply = (struct iphdr*) buffer; }
Also ich weiss nicht genau wo der Fehler liegt, ich vermute es liegt an der Definition der Internetaddrese für meinen Socket.
Sorry für die Fehler aber Deutsch ist leider nicht meine Muttersprache.
LG Enrique
-
Firewalls sind auch immer 'nen Verdacht wert. Evtl. werden ICMP-Pakete an der Gegenstelle verworfen?
-
Danke für deine schnelle Antwort
Ich habe ein ping an dieser Addrese gemacht und kriege eine Antwort, also sollte eigentlich kein Problem sein.
LG Enrique