3,286
社区成员
发帖
与我相关
我的任务
分享
#define PING_DATA_LEN (61)
typedef unsigned char byte;
typedef struct {
byte type;
byte code;
char * description;
} ICMP_DESCRIPTION;
typedef struct {
byte protocol;
char * description;
} PROTOCOLS_ON_IP;
typedef struct
{
byte type;
byte code;
unsigned short checksum;
} ICMPHead;
typedef struct
{
unsigned short label;
unsigned short seqnum;
byte text[PING_DATA_LEN];
}PingData;
typedef struct
{
byte ver_headlen;
byte tos;
unsigned short packlen;
unsigned short seq;
unsigned short segment_offset;
byte ttl;
byte protocol;
unsigned short checksum;
unsigned int srcip;
unsigned int dstip;
}IPHead;
组包发送
unsigned short chksum16(byte *buf, size_t len)
{
unsigned int sum = 0;
for(sum = 0; len > 1; len -= 2)
{
sum += *((unsigned short *)buf);
buf += 2;
}
if(len == 1) // for odd byte
sum += ((*buf)<<8);
sum = (sum>>16) + (sum&0xffff);
sum += (sum>>16);
return ~sum;
}
int main(int argc, char ** argv)
{
int rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
pthread_t tid;
struct sockaddr_in destaddr;
destaddr.sin_family = AF_INET;
destaddr.sin_port = 0;
if(argc>1)
destaddr.sin_addr.s_addr = inet_addr(argv[1]);
else
destaddr.sin_addr.s_addr = inet_addr("172.26.11.123");
int pinglen = sizeof(ICMPHead) + sizeof(PingData);
void * data = malloc(pinglen);
char * p = (char *)data;
((ICMPHead *)p)->type = 8;
((ICMPHead *)p)->code = 0;
((ICMPHead *)p)->checksum = 0; // we take care of this later
p = p + sizeof(ICMPHead);
((PingData *)p)->label = 0;
((PingData *)p)->seqnum = 0;
memset(p+4, 'A', PING_DATA_LEN);
((ICMPHead *)data)->checksum = chksum16((byte *)data, pinglen);
printf("create receiver!\n");
pthread_create(&tid, NULL, receiver, (void *)rawsock);
int i = 0;
while (i<4)
{
printf("send icmp package %d!\n", i);
sendto(rawsock, (void *)data, pinglen, 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
i++; sleep(1);
}
sleep(4);
printf("Mission Completed!\n");
return 0;
}
icmphdr->checksum =cal_chksum((unsigned short*)icmphdr, sizeof(struct icmphdr));
ICMP校验和需要覆盖整个ICMP包,你这里只计算了头部吧?
另外,发大段代码的时候,使用code标签,会有不错的格式化。这样子观众才有兴趣看。