Erreur lors de la compilation d'un programmeC
talelh
Messages postés
17
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
je suis sous ubuntu,et j'essaie de compiler un programme en c++ ====> mais une erreur c'est produit que je ne comprend pas, s'il vous plait aider moi à le resoudre.
voilà le message qui s'affiche:
nouveau-ping.c:35:22: erreur: internal.h : Aucun fichier ou dossier de ce type
je suis sous ubuntu,et j'essaie de compiler un programme en c++ ====> mais une erreur c'est produit que je ne comprend pas, s'il vous plait aider moi à le resoudre.
voilà le message qui s'affiche:
nouveau-ping.c:35:22: erreur: internal.h : Aucun fichier ou dossier de ce type
A voir également:
- Erreur lors de la compilation d'un programmeC
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
7 réponses
As-tu fait un include vers le fichier "internal.h" ?
Il semble mal fait ou bien le fichier n'existe pas.
Il semble mal fait ou bien le fichier n'existe pas.
Comment compiles-tu, avec un Makefile, directement depuis le shell?
Chez moi locate '/internal.h' | grep '/usr/' ne donne rien.
J'en conclus que tu utilise une bibliothèque extérieure au système de base.
Pour internal.h
Quel est ton projet ?
Johan
Chez moi locate '/internal.h' | grep '/usr/' ne donne rien.
J'en conclus que tu utilise une bibliothèque extérieure au système de base.
Pour internal.h
johand@osiris:~$ apt-file search '/internal.h' | grep 'h$' ecl: /usr/include/ecl/internal.h libee-dev: /usr/include/libee/internal.h libggi2-dev: /usr/include/ggi/internal/internal.h oss4-dkms: /usr/src/oss4-4.2-build2003/core/internal.h
Quel est ton projet ?
Johan
bon voilà la résultat:
hamhoum@TALEL-PC:~/Bureau$ apt-file search '/internal.h' | grep 'h$'
ecl: /usr/include/ecl/internal.h
libggi2-dev: /usr/include/ggi/internal/internal.h
libmyth-dev: /usr/include/mythtv/ffmpeg/internal.h
" je fait un programme ping qui test l'état des hôtes: existants ou non sur le réseau"
hamhoum@TALEL-PC:~/Bureau$ apt-file search '/internal.h' | grep 'h$'
ecl: /usr/include/ecl/internal.h
libggi2-dev: /usr/include/ggi/internal/internal.h
libmyth-dev: /usr/include/mythtv/ffmpeg/internal.h
" je fait un programme ping qui test l'état des hôtes: existants ou non sur le réseau"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
oui voilà comment déclarer dans le programme :
#include "internal.h"
Je ne pense pas que ton fichier se trouve dans le répertoire courant.
#include <header> // cherche le fichier dans le répertoire des en-têtes standard
#include "header.h" // cherche le fichier dans le répertoire courant
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
oui voilà comment déclarer dans le programme :
#include "internal.h"
Je ne pense pas que ton fichier se trouve dans le répertoire courant.
#include <header> // cherche le fichier dans le répertoire des en-têtes standard
#include "header.h" // cherche le fichier dans le répertoire courant
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
j'écris mon programme ping dans un fichier "nouveau-ping.c"
dans ce code à la 1er ligne je déclare les bibliothèques:
#include <internal.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
puis à l'aide de commande shell: gcc nouveau-ping.c -o nouveau-ping ==>pour compiler.
la résultat: nouveau-ping.c:35:22: erreur: internal.h : Aucun fichier ou dossier de ce type.
internal.h =>trés important pour le bon fonctionnement de code.
dans ce code à la 1er ligne je déclare les bibliothèques:
#include <internal.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
puis à l'aide de commande shell: gcc nouveau-ping.c -o nouveau-ping ==>pour compiler.
la résultat: nouveau-ping.c:35:22: erreur: internal.h : Aucun fichier ou dossier de ce type.
internal.h =>trés important pour le bon fonctionnement de code.
Si ça ne te déranges et si tu veux bien sûr tu peux coller ici le code pour essayer une compilation chez moi.
bien sûr que non.
voilà le code:
/* vi: set sw=4 ts=4: */
/*
* $Id: ping.c,v 1.1 2000/08/21 17:38:46 erich-roncarolo Exp $
* Mini ping implementation for busybox
*
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This version of ping is adapted from the ping in netkit-base 0.10,
* which is:
*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Original copyright notice is retained at the end of this file.
*/
#include <internal.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
/* It turns out that libc5 doesn't have proper icmp support
* built into it header files, so we have to supplement it */
#if ! defined __GLIBC__ && ! defined __UCLIBC__
typedef unsigned int socklen_t;
#define ICMP_MINLEN 8 /* abs minimum */
struct icmp_ra_addr
{
u_int32_t ira_addr;
u_int32_t ira_preference;
};
struct icmp
{
u_int8_t icmp_type; /* type of message, see below */
u_int8_t icmp_code; /* type sub code */
u_int16_t icmp_cksum; /* ones complement checksum of struct */
union
{
u_char ih_pptr; /* ICMP_PARAMPROB */
struct in_addr ih_gwaddr; /* gateway address */
struct ih_idseq /* echo datagram */
{
u_int16_t icd_id;
u_int16_t icd_seq;
} ih_idseq;
u_int32_t ih_void;
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
struct ih_pmtu
{
u_int16_t ipm_void;
u_int16_t ipm_nextmtu;
} ih_pmtu;
struct ih_rtradv
{
u_int8_t irt_num_addrs;
u_int8_t irt_wpa;
u_int16_t irt_lifetime;
} ih_rtradv;
} icmp_hun;
#define icmp_pptr icmp_hun.ih_pptr
#define icmp_gwaddr icmp_hun.ih_gwaddr
#define icmp_id icmp_hun.ih_idseq.icd_id
#define icmp_seq icmp_hun.ih_idseq.icd_seq
#define icmp_void icmp_hun.ih_void
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
union
{
struct
{
u_int32_t its_otime;
u_int32_t its_rtime;
u_int32_t its_ttime;
} id_ts;
struct
{
struct ip idi_ip;
/* options and then 64 bits of data */
} id_ip;
struct icmp_ra_addr id_radv;
u_int32_t id_mask;
u_int8_t id_data[1];
} icmp_dun;
#define icmp_otime icmp_dun.id_ts.its_otime
#define icmp_rtime icmp_dun.id_ts.its_rtime
#define icmp_ttime icmp_dun.id_ts.its_ttime
#define icmp_ip icmp_dun.id_ip.idi_ip
#define icmp_radv icmp_dun.id_radv
#define icmp_mask icmp_dun.id_mask
#define icmp_data icmp_dun.id_data
};
#endif
#define DEFDATALEN 56
#define MAXIPLEN 60
#define MAXICMPLEN 76
#define MAXPACKET 65468
#define MAX_DUP_CHK (8 * 128)
#define MAXWAIT 10
#define PINGINTERVAL 1 /* second */
#define O_QUIET (1 << 0)
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
#define SET(bit) (A(bit) |= B(bit))
#define CLR(bit) (A(bit) &= (~B(bit)))
#define TST(bit) (A(bit) & B(bit))
static void ping(const char *host);
/* common routines */
static int in_cksum(unsigned short *buf, int sz)
{
int nleft = sz;
int sum = 0;
unsigned short *w = buf;
unsigned short ans = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(unsigned char *) (&ans) = *(unsigned char *) w;
sum += ans;
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
ans = ~sum;
return (ans);
}
/* simple version */
#ifdef BB_FEATURE_SIMPLE_PING
static const char *ping_usage = "ping host\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
"\nSend ICMP ECHO_REQUEST packets to network hosts\n"
#endif
;
static char *hostname = NULL;
static void noresp(int ign)
{
printf("No response from %s\n", hostname);
exit(0);
}
static void ping(const char *host)
{
struct hostent *h;
struct sockaddr_in pingaddr;
struct icmp *pkt;
int pingsock, c;
char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) { /* 1 == ICMP */
perror("ping: creating a raw socket");
exit(1);
}
/* drop root privs if running setuid */
setuid(getuid());
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
pingaddr.sin_family = AF_INET;
if (!(h = gethostbyname(host))) {
fprintf(stderr, "ping: unknown host %s\n", host);
exit(1);
}
memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr));
hostname = h->h_name;
pkt = (struct icmp *) packet;
memset(pkt, 0, sizeof(packet));
pkt->icmp_type = ICMP_ECHO;
pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet));
c = sendto(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (c < 0 || c != sizeof(packet)) {
if (c < 0)
perror("ping: sendto");
fprintf(stderr, "ping: write incomplete\n");
exit(1);
}
signal(SIGALRM, noresp);
alarm(5); /* give the host 5000ms to respond */
/* listen for replies */
while (1) {
struct sockaddr_in from;
size_t fromlen = sizeof(from);
if ((c = recvfrom(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
perror("ping: recvfrom");
continue;
}
if (c >= 76) { /* ip + icmp */
struct iphdr *iphdr = (struct iphdr *) packet;
pkt = (struct icmp *) (packet + (iphdr->ihl << 2)); /* skip ip hdr */
if (pkt->icmp_type == ICMP_ECHOREPLY)
break;
}
}
printf("%s is alive!\n", hostname);
return;
}
extern int ping_main(int argc, char **argv)
{
argc--;
argv++;
if (argc < 1)
usage(ping_usage);
ping(*argv);
exit(TRUE);
}
#else /* ! BB_FEATURE_SIMPLE_PING */
/* full(er) version */
static const char *ping_usage = "ping [OPTION]... host\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
"\nSend ICMP ECHO_REQUEST packets to network hosts.\n\n"
"Options:\n"
"\t-c COUNT\tSend only COUNT pings.\n"
"\t-s SIZE\t\tSend SIZE data bytes in packets (default=56).\n"
"\t-q\t\tQuiet mode, only displays output at start\n"
"\t\t\tand when finished.\n"
#endif
;
static char *hostname = NULL;
static struct sockaddr_in pingaddr;
static int pingsock = -1;
static int datalen = DEFDATALEN;
static long ntransmitted = 0, nreceived = 0, nrepeats = 0, pingcount = 0;
static int myid = 0, options = 0;
static unsigned long tmin = ULONG_MAX, tmax = 0, tsum = 0;
static char rcvd_tbl[MAX_DUP_CHK / 8];
static void sendping(int);
static void pingstats(int);
static void unpack(char *, int, struct sockaddr_in *);
/**************************************************************************/
static void pingstats(int ign)
{
signal(SIGINT, SIG_IGN);
printf("\n--- %s ping statistics ---\n", hostname);
printf("%ld packets transmitted, ", ntransmitted);
printf("%ld packets received, ", nreceived);
if (nrepeats)
printf("%ld duplicates, ", nrepeats);
if (ntransmitted)
printf("%ld%% packet loss\n",
(ntransmitted - nreceived) * 100 / ntransmitted);
if (nreceived)
printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n",
tmin / 10, tmin % 10,
(tsum / (nreceived + nrepeats)) / 10,
(tsum / (nreceived + nrepeats)) % 10, tmax / 10, tmax % 10);
exit(0);
}
static void sendping(int ign)
{
struct icmp *pkt;
int i;
char packet[datalen + 8];
pkt = (struct icmp *) packet;
pkt->icmp_type = ICMP_ECHO;
pkt->icmp_code = 0;
pkt->icmp_cksum = 0;
pkt->icmp_seq = ntransmitted++;
pkt->icmp_id = myid;
CLR(pkt->icmp_seq % MAX_DUP_CHK);
gettimeofday((struct timeval *) &packet[8], NULL);
pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet));
i = sendto(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (i < 0)
fatalError("ping: sendto: %s\n", strerror(errno));
else if (i != sizeof(packet))
fatalError("ping wrote %d chars; %d expected\n", i,
(int)sizeof(packet));
signal(SIGALRM, sendping);
if (pingcount == 0 || ntransmitted < pingcount) { /* schedule next in 1s */
alarm(PINGINTERVAL);
} else { /* done, wait for the last ping to come back */
/* todo, don't necessarily need to wait so long... */
signal(SIGALRM, pingstats);
alarm(MAXWAIT);
}
}
static char *icmp_type_name (int id)
{
switch (id) {
case ICMP_ECHOREPLY: return "Echo Reply";
case ICMP_DEST_UNREACH: return "Destination Unreachable";
case ICMP_SOURCE_QUENCH: return "Source Quench";
case ICMP_REDIRECT: return "Redirect (change route)";
case ICMP_ECHO: return "Echo Request";
case ICMP_TIME_EXCEEDED: return "Time Exceeded";
case ICMP_PARAMETERPROB: return "Parameter Problem";
case ICMP_TIMESTAMP: return "Timestamp Request";
case ICMP_TIMESTAMPREPLY: return "Timestamp Reply";
case ICMP_INFO_REQUEST: return "Information Request";
case ICMP_INFO_REPLY: return "Information Reply";
case ICMP_ADDRESS: return "Address Mask Request";
case ICMP_ADDRESSREPLY: return "Address Mask Reply";
default: return "unknown ICMP type";
}
}
static void unpack(char *buf, int sz, struct sockaddr_in *from)
{
struct icmp *icmppkt;
struct iphdr *iphdr;
struct timeval tv, *tp;
int hlen, dupflag;
unsigned long triptime;
gettimeofday(&tv, NULL);
/* check IP header */
iphdr = (struct iphdr *) buf;
hlen = iphdr->ihl << 2;
/* discard if too short */
if (sz < (datalen + ICMP_MINLEN))
return;
sz -= hlen;
icmppkt = (struct icmp *) (buf + hlen);
if (icmppkt->icmp_id != myid)
return; /* not our ping */
if (icmppkt->icmp_type == ICMP_ECHOREPLY) {
++nreceived;
tp = (struct timeval *) icmppkt->icmp_data;
if ((tv.tv_usec -= tp->tv_usec) < 0) {
--tv.tv_sec;
tv.tv_usec += 1000000;
}
tv.tv_sec -= tp->tv_sec;
triptime = tv.tv_sec * 10000 + (tv.tv_usec / 100);
tsum += triptime;
if (triptime < tmin)
tmin = triptime;
if (triptime > tmax)
tmax = triptime;
if (TST(icmppkt->icmp_seq % MAX_DUP_CHK)) {
++nrepeats;
--nreceived;
dupflag = 1;
} else {
SET(icmppkt->icmp_seq % MAX_DUP_CHK);
dupflag = 0;
}
if (options & O_QUIET)
return;
printf("%d bytes from %s: icmp_seq=%u", sz,
inet_ntoa(*(struct in_addr *) &from->sin_addr.s_addr),
icmppkt->icmp_seq);
printf(" ttl=%d", iphdr->ttl);
printf(" time=%lu.%lu ms", triptime / 10, triptime % 10);
if (dupflag)
printf(" (DUP!)");
printf("\n");
} else
if (icmppkt->icmp_type != ICMP_ECHO)
fprintf(stderr,
"Warning: Got ICMP %d (%s)\n",
icmppkt->icmp_type, icmp_type_name (icmppkt->icmp_type));
}
static void ping(const char *host)
{
struct protoent *proto;
struct hostent *h;
char buf[MAXHOSTNAMELEN];
char packet[datalen + MAXIPLEN + MAXICMPLEN];
int sockopt;
proto = getprotobyname("icmp");
/* if getprotobyname failed, just silently force
* proto->p_proto to have the correct value for "icmp" */
if ((pingsock = socket(AF_INET, SOCK_RAW,
(proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */
if (errno == EPERM) {
fprintf(stderr, "ping: permission denied. (are you root?)\n");
} else {
perror("ping: creating a raw socket");
}
exit(1);
}
/* drop root privs if running setuid */
setuid(getuid());
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
pingaddr.sin_family = AF_INET;
if (!(h = gethostbyname(host))) {
fprintf(stderr, "ping: unknown host %s\n", host);
exit(1);
}
if (h->h_addrtype != AF_INET) {
fprintf(stderr,
"ping: unknown address type; only AF_INET is currently supported.\n");
exit(1);
}
pingaddr.sin_family = AF_INET; /* h->h_addrtype */
memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr));
strncpy(buf, h->h_name, sizeof(buf) - 1);
hostname = buf;
/* enable broadcast pings */
sockopt = 1;
setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
sizeof(sockopt));
/* set recv buf for broadcast pings */
sockopt = 48 * 1024;
setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt,
sizeof(sockopt));
printf("PING %s (%s): %d data bytes\n",
hostname,
inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr),
datalen);
signal(SIGINT, pingstats);
/* start the ping's going ... */
sendping(0);
/* listen for replies */
while (1) {
struct sockaddr_in from;
socklen_t fromlen = (socklen_t) sizeof(from);
int c;
if ((c = recvfrom(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
perror("ping: recvfrom");
continue;
}
unpack(packet, c, &from);
if (pingcount > 0 && nreceived >= pingcount)
break;
}
pingstats(0);
}
extern int ping_main(int argc, char **argv)
{
char *thisarg;
argc--;
argv++;
options = 0;
/* Parse any options */
while (argc >= 1 && **argv == '-') {
thisarg = *argv;
thisarg++;
switch (*thisarg) {
case 'q':
options |= O_QUIET;
break;
case 'c':
if (--argc <= 0)
usage(ping_usage);
argv++;
pingcount = atoi(*argv);
break;
case 's':
if (--argc <= 0)
usage(ping_usage);
argv++;
datalen = atoi(*argv);
break;
default:
usage(ping_usage);
}
argc--;
argv++;
}
if (argc < 1)
usage(ping_usage);
myid = getpid() & 0xFFFF;
ping(*argv);
return 1;
}
#endif /* ! BB_FEATURE_SIMPLE_PING */
/*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
bien sûr que non.
voilà le code:
/* vi: set sw=4 ts=4: */
/*
* $Id: ping.c,v 1.1 2000/08/21 17:38:46 erich-roncarolo Exp $
* Mini ping implementation for busybox
*
* Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This version of ping is adapted from the ping in netkit-base 0.10,
* which is:
*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Original copyright notice is retained at the end of this file.
*/
#include <internal.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
/* It turns out that libc5 doesn't have proper icmp support
* built into it header files, so we have to supplement it */
#if ! defined __GLIBC__ && ! defined __UCLIBC__
typedef unsigned int socklen_t;
#define ICMP_MINLEN 8 /* abs minimum */
struct icmp_ra_addr
{
u_int32_t ira_addr;
u_int32_t ira_preference;
};
struct icmp
{
u_int8_t icmp_type; /* type of message, see below */
u_int8_t icmp_code; /* type sub code */
u_int16_t icmp_cksum; /* ones complement checksum of struct */
union
{
u_char ih_pptr; /* ICMP_PARAMPROB */
struct in_addr ih_gwaddr; /* gateway address */
struct ih_idseq /* echo datagram */
{
u_int16_t icd_id;
u_int16_t icd_seq;
} ih_idseq;
u_int32_t ih_void;
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
struct ih_pmtu
{
u_int16_t ipm_void;
u_int16_t ipm_nextmtu;
} ih_pmtu;
struct ih_rtradv
{
u_int8_t irt_num_addrs;
u_int8_t irt_wpa;
u_int16_t irt_lifetime;
} ih_rtradv;
} icmp_hun;
#define icmp_pptr icmp_hun.ih_pptr
#define icmp_gwaddr icmp_hun.ih_gwaddr
#define icmp_id icmp_hun.ih_idseq.icd_id
#define icmp_seq icmp_hun.ih_idseq.icd_seq
#define icmp_void icmp_hun.ih_void
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
union
{
struct
{
u_int32_t its_otime;
u_int32_t its_rtime;
u_int32_t its_ttime;
} id_ts;
struct
{
struct ip idi_ip;
/* options and then 64 bits of data */
} id_ip;
struct icmp_ra_addr id_radv;
u_int32_t id_mask;
u_int8_t id_data[1];
} icmp_dun;
#define icmp_otime icmp_dun.id_ts.its_otime
#define icmp_rtime icmp_dun.id_ts.its_rtime
#define icmp_ttime icmp_dun.id_ts.its_ttime
#define icmp_ip icmp_dun.id_ip.idi_ip
#define icmp_radv icmp_dun.id_radv
#define icmp_mask icmp_dun.id_mask
#define icmp_data icmp_dun.id_data
};
#endif
#define DEFDATALEN 56
#define MAXIPLEN 60
#define MAXICMPLEN 76
#define MAXPACKET 65468
#define MAX_DUP_CHK (8 * 128)
#define MAXWAIT 10
#define PINGINTERVAL 1 /* second */
#define O_QUIET (1 << 0)
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
#define SET(bit) (A(bit) |= B(bit))
#define CLR(bit) (A(bit) &= (~B(bit)))
#define TST(bit) (A(bit) & B(bit))
static void ping(const char *host);
/* common routines */
static int in_cksum(unsigned short *buf, int sz)
{
int nleft = sz;
int sum = 0;
unsigned short *w = buf;
unsigned short ans = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(unsigned char *) (&ans) = *(unsigned char *) w;
sum += ans;
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
ans = ~sum;
return (ans);
}
/* simple version */
#ifdef BB_FEATURE_SIMPLE_PING
static const char *ping_usage = "ping host\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
"\nSend ICMP ECHO_REQUEST packets to network hosts\n"
#endif
;
static char *hostname = NULL;
static void noresp(int ign)
{
printf("No response from %s\n", hostname);
exit(0);
}
static void ping(const char *host)
{
struct hostent *h;
struct sockaddr_in pingaddr;
struct icmp *pkt;
int pingsock, c;
char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
if ((pingsock = socket(AF_INET, SOCK_RAW, 1)) < 0) { /* 1 == ICMP */
perror("ping: creating a raw socket");
exit(1);
}
/* drop root privs if running setuid */
setuid(getuid());
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
pingaddr.sin_family = AF_INET;
if (!(h = gethostbyname(host))) {
fprintf(stderr, "ping: unknown host %s\n", host);
exit(1);
}
memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr));
hostname = h->h_name;
pkt = (struct icmp *) packet;
memset(pkt, 0, sizeof(packet));
pkt->icmp_type = ICMP_ECHO;
pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet));
c = sendto(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (c < 0 || c != sizeof(packet)) {
if (c < 0)
perror("ping: sendto");
fprintf(stderr, "ping: write incomplete\n");
exit(1);
}
signal(SIGALRM, noresp);
alarm(5); /* give the host 5000ms to respond */
/* listen for replies */
while (1) {
struct sockaddr_in from;
size_t fromlen = sizeof(from);
if ((c = recvfrom(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
perror("ping: recvfrom");
continue;
}
if (c >= 76) { /* ip + icmp */
struct iphdr *iphdr = (struct iphdr *) packet;
pkt = (struct icmp *) (packet + (iphdr->ihl << 2)); /* skip ip hdr */
if (pkt->icmp_type == ICMP_ECHOREPLY)
break;
}
}
printf("%s is alive!\n", hostname);
return;
}
extern int ping_main(int argc, char **argv)
{
argc--;
argv++;
if (argc < 1)
usage(ping_usage);
ping(*argv);
exit(TRUE);
}
#else /* ! BB_FEATURE_SIMPLE_PING */
/* full(er) version */
static const char *ping_usage = "ping [OPTION]... host\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
"\nSend ICMP ECHO_REQUEST packets to network hosts.\n\n"
"Options:\n"
"\t-c COUNT\tSend only COUNT pings.\n"
"\t-s SIZE\t\tSend SIZE data bytes in packets (default=56).\n"
"\t-q\t\tQuiet mode, only displays output at start\n"
"\t\t\tand when finished.\n"
#endif
;
static char *hostname = NULL;
static struct sockaddr_in pingaddr;
static int pingsock = -1;
static int datalen = DEFDATALEN;
static long ntransmitted = 0, nreceived = 0, nrepeats = 0, pingcount = 0;
static int myid = 0, options = 0;
static unsigned long tmin = ULONG_MAX, tmax = 0, tsum = 0;
static char rcvd_tbl[MAX_DUP_CHK / 8];
static void sendping(int);
static void pingstats(int);
static void unpack(char *, int, struct sockaddr_in *);
/**************************************************************************/
static void pingstats(int ign)
{
signal(SIGINT, SIG_IGN);
printf("\n--- %s ping statistics ---\n", hostname);
printf("%ld packets transmitted, ", ntransmitted);
printf("%ld packets received, ", nreceived);
if (nrepeats)
printf("%ld duplicates, ", nrepeats);
if (ntransmitted)
printf("%ld%% packet loss\n",
(ntransmitted - nreceived) * 100 / ntransmitted);
if (nreceived)
printf("round-trip min/avg/max = %lu.%lu/%lu.%lu/%lu.%lu ms\n",
tmin / 10, tmin % 10,
(tsum / (nreceived + nrepeats)) / 10,
(tsum / (nreceived + nrepeats)) % 10, tmax / 10, tmax % 10);
exit(0);
}
static void sendping(int ign)
{
struct icmp *pkt;
int i;
char packet[datalen + 8];
pkt = (struct icmp *) packet;
pkt->icmp_type = ICMP_ECHO;
pkt->icmp_code = 0;
pkt->icmp_cksum = 0;
pkt->icmp_seq = ntransmitted++;
pkt->icmp_id = myid;
CLR(pkt->icmp_seq % MAX_DUP_CHK);
gettimeofday((struct timeval *) &packet[8], NULL);
pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet));
i = sendto(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in));
if (i < 0)
fatalError("ping: sendto: %s\n", strerror(errno));
else if (i != sizeof(packet))
fatalError("ping wrote %d chars; %d expected\n", i,
(int)sizeof(packet));
signal(SIGALRM, sendping);
if (pingcount == 0 || ntransmitted < pingcount) { /* schedule next in 1s */
alarm(PINGINTERVAL);
} else { /* done, wait for the last ping to come back */
/* todo, don't necessarily need to wait so long... */
signal(SIGALRM, pingstats);
alarm(MAXWAIT);
}
}
static char *icmp_type_name (int id)
{
switch (id) {
case ICMP_ECHOREPLY: return "Echo Reply";
case ICMP_DEST_UNREACH: return "Destination Unreachable";
case ICMP_SOURCE_QUENCH: return "Source Quench";
case ICMP_REDIRECT: return "Redirect (change route)";
case ICMP_ECHO: return "Echo Request";
case ICMP_TIME_EXCEEDED: return "Time Exceeded";
case ICMP_PARAMETERPROB: return "Parameter Problem";
case ICMP_TIMESTAMP: return "Timestamp Request";
case ICMP_TIMESTAMPREPLY: return "Timestamp Reply";
case ICMP_INFO_REQUEST: return "Information Request";
case ICMP_INFO_REPLY: return "Information Reply";
case ICMP_ADDRESS: return "Address Mask Request";
case ICMP_ADDRESSREPLY: return "Address Mask Reply";
default: return "unknown ICMP type";
}
}
static void unpack(char *buf, int sz, struct sockaddr_in *from)
{
struct icmp *icmppkt;
struct iphdr *iphdr;
struct timeval tv, *tp;
int hlen, dupflag;
unsigned long triptime;
gettimeofday(&tv, NULL);
/* check IP header */
iphdr = (struct iphdr *) buf;
hlen = iphdr->ihl << 2;
/* discard if too short */
if (sz < (datalen + ICMP_MINLEN))
return;
sz -= hlen;
icmppkt = (struct icmp *) (buf + hlen);
if (icmppkt->icmp_id != myid)
return; /* not our ping */
if (icmppkt->icmp_type == ICMP_ECHOREPLY) {
++nreceived;
tp = (struct timeval *) icmppkt->icmp_data;
if ((tv.tv_usec -= tp->tv_usec) < 0) {
--tv.tv_sec;
tv.tv_usec += 1000000;
}
tv.tv_sec -= tp->tv_sec;
triptime = tv.tv_sec * 10000 + (tv.tv_usec / 100);
tsum += triptime;
if (triptime < tmin)
tmin = triptime;
if (triptime > tmax)
tmax = triptime;
if (TST(icmppkt->icmp_seq % MAX_DUP_CHK)) {
++nrepeats;
--nreceived;
dupflag = 1;
} else {
SET(icmppkt->icmp_seq % MAX_DUP_CHK);
dupflag = 0;
}
if (options & O_QUIET)
return;
printf("%d bytes from %s: icmp_seq=%u", sz,
inet_ntoa(*(struct in_addr *) &from->sin_addr.s_addr),
icmppkt->icmp_seq);
printf(" ttl=%d", iphdr->ttl);
printf(" time=%lu.%lu ms", triptime / 10, triptime % 10);
if (dupflag)
printf(" (DUP!)");
printf("\n");
} else
if (icmppkt->icmp_type != ICMP_ECHO)
fprintf(stderr,
"Warning: Got ICMP %d (%s)\n",
icmppkt->icmp_type, icmp_type_name (icmppkt->icmp_type));
}
static void ping(const char *host)
{
struct protoent *proto;
struct hostent *h;
char buf[MAXHOSTNAMELEN];
char packet[datalen + MAXIPLEN + MAXICMPLEN];
int sockopt;
proto = getprotobyname("icmp");
/* if getprotobyname failed, just silently force
* proto->p_proto to have the correct value for "icmp" */
if ((pingsock = socket(AF_INET, SOCK_RAW,
(proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */
if (errno == EPERM) {
fprintf(stderr, "ping: permission denied. (are you root?)\n");
} else {
perror("ping: creating a raw socket");
}
exit(1);
}
/* drop root privs if running setuid */
setuid(getuid());
memset(&pingaddr, 0, sizeof(struct sockaddr_in));
pingaddr.sin_family = AF_INET;
if (!(h = gethostbyname(host))) {
fprintf(stderr, "ping: unknown host %s\n", host);
exit(1);
}
if (h->h_addrtype != AF_INET) {
fprintf(stderr,
"ping: unknown address type; only AF_INET is currently supported.\n");
exit(1);
}
pingaddr.sin_family = AF_INET; /* h->h_addrtype */
memcpy(&pingaddr.sin_addr, h->h_addr, sizeof(pingaddr.sin_addr));
strncpy(buf, h->h_name, sizeof(buf) - 1);
hostname = buf;
/* enable broadcast pings */
sockopt = 1;
setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
sizeof(sockopt));
/* set recv buf for broadcast pings */
sockopt = 48 * 1024;
setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt,
sizeof(sockopt));
printf("PING %s (%s): %d data bytes\n",
hostname,
inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr),
datalen);
signal(SIGINT, pingstats);
/* start the ping's going ... */
sendping(0);
/* listen for replies */
while (1) {
struct sockaddr_in from;
socklen_t fromlen = (socklen_t) sizeof(from);
int c;
if ((c = recvfrom(pingsock, packet, sizeof(packet), 0,
(struct sockaddr *) &from, &fromlen)) < 0) {
if (errno == EINTR)
continue;
perror("ping: recvfrom");
continue;
}
unpack(packet, c, &from);
if (pingcount > 0 && nreceived >= pingcount)
break;
}
pingstats(0);
}
extern int ping_main(int argc, char **argv)
{
char *thisarg;
argc--;
argv++;
options = 0;
/* Parse any options */
while (argc >= 1 && **argv == '-') {
thisarg = *argv;
thisarg++;
switch (*thisarg) {
case 'q':
options |= O_QUIET;
break;
case 'c':
if (--argc <= 0)
usage(ping_usage);
argv++;
pingcount = atoi(*argv);
break;
case 's':
if (--argc <= 0)
usage(ping_usage);
argv++;
datalen = atoi(*argv);
break;
default:
usage(ping_usage);
}
argc--;
argv++;
}
if (argc < 1)
usage(ping_usage);
myid = getpid() & 0xFFFF;
ping(*argv);
return 1;
}
#endif /* ! BB_FEATURE_SIMPLE_PING */
/*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Mike Muuss.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
Salut,
Vu que tu utilise le internal.h qui se trouve dans /usr/include/ecl alors mets
Tu vas avoir en revanche plein d'erreurs, essaye de compiler et tu verras.
Si tu regardes bien il n'y a pas de fonction main dans le fichier.
Je pense qu'il se trouve dans d'un outil qui contient la commande ping. Lequel?
Où tu as téléchargé le fichier?
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
Vu que tu utilise le internal.h qui se trouve dans /usr/include/ecl alors mets
#include <ecl/internal.h>
Tu vas avoir en revanche plein d'erreurs, essaye de compiler et tu verras.
Si tu regardes bien il n'y a pas de fonction main dans le fichier.
Je pense qu'il se trouve dans d'un outil qui contient la commande ping. Lequel?
Où tu as téléchargé le fichier?
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108