G
genoeffo
Hi all,
I'm trying to compile compile a little ping program with
gcc -o myping myping.c
I have no problems, but if I compile it with
gcc -o myping -std=c99 myping.c
the result is:
"
myping.c: In function 'main':
myping.c:62: warning: implicit declaration of function 'inet_aton'
myping.c:67: error: dereferencing pointer to incomplete type
myping.c:68: error: dereferencing pointer to incomplete type
myping.c:69: error: dereferencing pointer to incomplete type
myping.c:70: error: dereferencing pointer to incomplete type
myping.c:71: error: dereferencing pointer to incomplete type
myping.c:72: error: dereferencing pointer to incomplete type
myping.c:73: error: dereferencing pointer to incomplete type
myping.c:78: error: dereferencing pointer to incomplete type
myping.c:85: error: dereferencing pointer to incomplete type
myping.c:87: error: dereferencing pointer to incomplete type
myping.c:89: error: dereferencing pointer to incomplete type
"
How can I solve this problem?
Thank you in advance for your help,
Gg.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAX_PACKET 1000
#define ICMP_SIZE 16
unsigned short check_sum(unsigned short *addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short *w = addr;
unsigned short answer = 0;
while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
{
*(unsigned char *)(&answer) = * (unsigned char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum = sum + (sum >> 16);
answer = ~sum;
return answer;
}
void timeval_sub(struct timeval *out, struct timeval *in)
{
out->tv_sec = out->tv_sec - in->tv_sec;
out->tv_usec = out->tv_usec - in->tv_usec;
if (out->tv_sec < 0)
{
out->tv_usec += 1000000;
out->tv_sec--;
}
}
int main(int argc, char *argv[])
{
int icmp_socket_fd;
struct sockaddr_in icmp_socket_info;
struct in_addr addr;
struct icmp *icmp_buf;
char pkt_buf[MAX_PACKET];
struct ip *ip = (struct ip *)pkt_buf;
struct timeval tv, appo_tv;
icmp_socket_fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
inet_aton(argv[1], &addr);
icmp_socket_info.sin_family = AF_INET;
icmp_socket_info.sin_addr.s_addr = addr.s_addr;
icmp_buf = (struct icmp *)pkt_buf;
icmp_buf->icmp_type = ICMP_ECHO;
icmp_buf->icmp_code = 0;
icmp_buf->icmp_id = getpid();
icmp_buf->icmp_seq = 0;
gettimeofday((struct timeval *)icmp_buf->icmp_data, NULL);
icmp_buf->icmp_cksum = 0;
icmp_buf->icmp_cksum = check_sum((unsigned short *)icmp_buf,
ICMP_SIZE);
sendto(icmp_socket_fd, icmp_buf, ICMP_SIZE, 0, (struct sockaddr *)
&icmp_socket_info, sizeof(icmp_socket_info));
do
{
gettimeofday(&appo_tv, NULL);
timeval_sub(&appo_tv, (struct timeval *)icmp_buf->
icmp_data);
recvfrom(icmp_socket_fd, pkt_buf, sizeof(pkt_buf), 0, NULL,
NULL);
icmp_buf = (struct icmp *) (pkt_buf+ip->ip_hl*4);;
}
while(icmp_buf->icmp_type != ICMP_ECHOREPLY );
gettimeofday(&tv, NULL);
timeval_sub(&tv, (struct timeval *)icmp_buf->icmp_data);
printf("Ping received in %ld micro sec\n", tv.tv_sec* 1000000
+tv.tv_usec);
}
PS
gcc --version
gcc (GCC) 4.1.0 20060304 (Red Hat 4.1.0-3)
I'm trying to compile compile a little ping program with
gcc -o myping myping.c
I have no problems, but if I compile it with
gcc -o myping -std=c99 myping.c
the result is:
"
myping.c: In function 'main':
myping.c:62: warning: implicit declaration of function 'inet_aton'
myping.c:67: error: dereferencing pointer to incomplete type
myping.c:68: error: dereferencing pointer to incomplete type
myping.c:69: error: dereferencing pointer to incomplete type
myping.c:70: error: dereferencing pointer to incomplete type
myping.c:71: error: dereferencing pointer to incomplete type
myping.c:72: error: dereferencing pointer to incomplete type
myping.c:73: error: dereferencing pointer to incomplete type
myping.c:78: error: dereferencing pointer to incomplete type
myping.c:85: error: dereferencing pointer to incomplete type
myping.c:87: error: dereferencing pointer to incomplete type
myping.c:89: error: dereferencing pointer to incomplete type
"
How can I solve this problem?
Thank you in advance for your help,
Gg.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAX_PACKET 1000
#define ICMP_SIZE 16
unsigned short check_sum(unsigned short *addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short *w = addr;
unsigned short answer = 0;
while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
{
*(unsigned char *)(&answer) = * (unsigned char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum = sum + (sum >> 16);
answer = ~sum;
return answer;
}
void timeval_sub(struct timeval *out, struct timeval *in)
{
out->tv_sec = out->tv_sec - in->tv_sec;
out->tv_usec = out->tv_usec - in->tv_usec;
if (out->tv_sec < 0)
{
out->tv_usec += 1000000;
out->tv_sec--;
}
}
int main(int argc, char *argv[])
{
int icmp_socket_fd;
struct sockaddr_in icmp_socket_info;
struct in_addr addr;
struct icmp *icmp_buf;
char pkt_buf[MAX_PACKET];
struct ip *ip = (struct ip *)pkt_buf;
struct timeval tv, appo_tv;
icmp_socket_fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
inet_aton(argv[1], &addr);
icmp_socket_info.sin_family = AF_INET;
icmp_socket_info.sin_addr.s_addr = addr.s_addr;
icmp_buf = (struct icmp *)pkt_buf;
icmp_buf->icmp_type = ICMP_ECHO;
icmp_buf->icmp_code = 0;
icmp_buf->icmp_id = getpid();
icmp_buf->icmp_seq = 0;
gettimeofday((struct timeval *)icmp_buf->icmp_data, NULL);
icmp_buf->icmp_cksum = 0;
icmp_buf->icmp_cksum = check_sum((unsigned short *)icmp_buf,
ICMP_SIZE);
sendto(icmp_socket_fd, icmp_buf, ICMP_SIZE, 0, (struct sockaddr *)
&icmp_socket_info, sizeof(icmp_socket_info));
do
{
gettimeofday(&appo_tv, NULL);
timeval_sub(&appo_tv, (struct timeval *)icmp_buf->
icmp_data);
recvfrom(icmp_socket_fd, pkt_buf, sizeof(pkt_buf), 0, NULL,
NULL);
icmp_buf = (struct icmp *) (pkt_buf+ip->ip_hl*4);;
}
while(icmp_buf->icmp_type != ICMP_ECHOREPLY );
gettimeofday(&tv, NULL);
timeval_sub(&tv, (struct timeval *)icmp_buf->icmp_data);
printf("Ping received in %ld micro sec\n", tv.tv_sec* 1000000
+tv.tv_usec);
}
PS
gcc --version
gcc (GCC) 4.1.0 20060304 (Red Hat 4.1.0-3)