Ребята, ну не получается у меня отослать пакет! Проблема заключается в чексумме. Я дописал функцию (нашел в инете) и всёравно никак! Подскжте где я ошибся плзз !!!
| Код | #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <resolv.h> #include <unistd.h> /* For getpid() */
#define ICMPHDR_SIZE 8 #define MAX_PACKET 64
unsigned short cksum(unsigned short *buf, int nbytes) { unsigned int sum; unsigned short oddbyte;
sum = 0; while (nbytes > 1) { sum += *buf++; nbytes -= 2; }
if (nbytes == 1) { oddbyte = 0; *((unsigned short *) &oddbyte) = *(unsigned short *) buf; sum += oddbyte; }
sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16);
return (unsigned short) ~sum; }
int main (int argc, char *argv[]) { if (argc != 2){ printf ("usage: ping <IP>\n"); return ; } char datagram[MAX_PACKET], recvbuf[1024]; int sequence = 0, s = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP), datalen = MAX_PACKET - sizeof(struct icmphdr); struct icmphdr *icmph = (struct icmphdr *)datagram; struct sockaddr_in sin; struct sockaddr_in from; bzero (&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr (argv[1]); memset (datagram, 0, MAX_PACKET); icmph->type = ICMP_ECHO; icmph->code = 0; icmph->checksum = cksum ((unsigned short *)datagram, MAX_PACKET); icmph->un.echo.id = getpid(); icmph->un.echo.sequence = sequence; if (sendto (s, datagram, MAX_PACKET, 0, &sin, sizeof(sin)) < 0) printf ("error\n"); recvfrom (s, recvbuf, sizeof(recvbuf), 0, (struct sockaddr_in *) &from, sizeof(from)); printf ("Reply from %s\n", inet_ntoa (from.sin_addr.s_addr)); return 0;
}
|
|