为什么我的ICMP包发出去后对方没有回应?
处学SOCK_RAW编程,想做一个Ping程序,但是发出ICMP数据报后对方没有回应,谁能告诉我为什么?
--------------------------------------------
typedef struct
{
unsigned char type;
unsigned char code;
unsigned short checksum;
union
{
struct
{
unsigned short id;
unsigned short sn;
}reply;
}Data;
}ICMP_HEADER
--------------------------------------------------------
unsigned int checksum(unsigned int *val,unsigned int length) //计算校验和
{
unsigned int sum = 0;
unsigned int left = length;
while(length > 1)
{
sum += *val;
val ++;
length -= 2;
}
if(length)
sum += (*val) & (0x00ff);
return ~sum;
}
int main(int argc ,char *argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
SOCKET sockRAW;
SOCKADDR_IN dst,src;
int timeout =1000;
sockRAW = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
int rev = setsockopt(sockRAW,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeout,sizeof(int));
if(rev == SOCKET_ERROR)
printf("Cannot Set SndTimedout\n");
rev = setsockopt(sockRAW,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(int));
if(rev == SOCKET_ERROR)
printf("Cannot set RcvTimedout\n");
int ttl = 128;
setsockopt(sockRAW,IPPROTO_IP,IP_TTL,(const char*)&ttl,sizeof(int));
char *buf = new char[MAXBUF+1];
ICMP_HEADER *icmphdr;
icmphdr = (ICMP_HEADER*)buf;
icmphdr->type = 8;
icmphdr->code = 0;
icmphdr->checksum = 0;
icmphdr->Data.reply.id = GetCurrentProcessId();
icmphdr->Data.reply.sn = 0;
memset(buf+sizeof(icmphdr)+4,'*',PACKET);
*(unsigned long*)(buf + sizeof(ICMP_HEADER)) = GetTickCount();
icmphdr->checksum = checksum((unsigned int*)&icmphdr,sizeof(icmphdr)+PACKET);
dst.sin_family = AF_INET;
dst.sin_addr .s_addr = inet_addr("192.168.0.1");
rev = sendto(sockRAW,buf,sizeof(icmphdr) + PACKET,0,(SOCKADDR*)&dst,sizeof(dst));
if(rev == SOCKET_ERROR)
{
if(WSAGetLastError() == WSAETIMEDOUT)
printf("Send Timedout\n");
else(" Connot reach host");
exit(0);
}
printf("Sendind...\n");
char *revbuf = new char[sizeof(src) + PACKET];
int len = sizeof(icmphdr) + PACKET;
recvfrom(sockRAW,revbuf,sizeof(src) + PACKET , 0 , (SOCKADDR *)&src,&len);
if(rev == SOCKET_ERROR)
{
if((rev = WSAGetLastError()) == WSAETIMEDOUT)
printf("Recieve Timedout\n");
else
printf("other error");
}
return 0;
}
----------------------------------------------------
从网络监视器上看到ICMP包已经发出去了,对方没有回应,但recvfrom也没返回超时,不知这是怎么回事?
那位大哥告诉我,小弟不胜感激,100分相送。