急救:ping程序为什么总是超时,没有包返回呢?

xuwei1231231 2007-04-02 10:30:40
各位大哥赶快帮帮小弟吧,刚开始学,不懂啊:
下面是我的ping程序:
#include "head.h"
#include <windows.h>

CInitSock initSock;

void main()
{
char szDestIp[] = "10.3.6.99";
SOCKET sRaw = ::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
//
int timeout = 1000;
::setsockopt(sRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
sockaddr_in sin;
sin.sin_family=AF_INET;
//sin.sin_port=::ntohs(0);
sin.sin_addr.S_un.S_addr=::inet_addr(szDestIp);
char buff[sizeof(ICMP_HDR)+32];
ICMP_HDR *pIcmp=(ICMP_HDR*)buff;
pIcmp->icmp_type=8;
pIcmp->icmp_code=0;
pIcmp->icmp_id=(USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum=0;
pIcmp->icmp_sequence=0;
memset(&buff[sizeof(ICMP_HDR)],'E',32);
USHORT nSeq = 0;
char nRecv [1024];
sockaddr_in from;
int nLen = sizeof(from);
while(1)
{
printf("come 1\n");
static int nCount=0;
int nRet;
if(nCount++==4)
break;
pIcmp->icmp_checksum=0;
pIcmp->icmp_timestamp=::GetTickCount();
pIcmp->icmp_sequence=nSeq++;
pIcmp->icmp_type=checksum((USHORT*)buff,sizeof(ICMP_HDR)+32);
printf("come 2\n");
nRet = ::sendto(sRaw,buff,sizeof(ICMP_HDR)+32,0,(sockaddr*)&sin,sizeof(sin));
if(nRet == SOCKET_ERROR)
{
printf("sendto() failed\n");
return ;
}
printf("come 3\n");
nRet = ::recvfrom(sRaw,nRecv,1024,0,(sockaddr*)&from,&nLen);
printf("come 4\n");
if(nRet == SOCKET_ERROR)
{
if(::WSAGetLastError()==WSAETIMEDOUT)
{
printf("time out\n");
continue;
}
printf("recvfrom(),fialed:%d\n",::WSAGetLastError());
return;
}
int nTick = ::GetTickCount();
if(nRet<sizeof(ICMP_HDR)+sizeof(IPHeader))
{
printf("too few bytes from %s\n",::inet_ntoa(from.sin_addr));
}
PICMP_HDR pRecvIcmp = (PICMP_HDR)(nRecv+sizeof(IPHeader));
if(pRecvIcmp->icmp_type!=0)
{
printf("none echo type %d recvd \n",pRecvIcmp->icmp_type);
return;
}
if(pRecvIcmp->icmp_id!=::GetCurrentProcessId())
{
printf("some one else's packet!\n");
return;
}
printf("%d bytes from %d: ",nRet,::inet_ntoa(from.sin_addr));
printf(" icmp_seq = %d",pRecvIcmp->icmp_sequence);
printf(" time:%d ms",nTick-pRecvIcmp->icmp_timestamp);
printf("\n");
::Sleep(1000);
}
return;
}
为什么总是返回超时,对方什么反应也没有呢?
...全文
618 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuwei1231231 2007-04-17
  • 打赏
  • 举报
回复
结贴,没有将ICMP的回显字段置位
xuwei1231231 2007-04-03
  • 打赏
  • 举报
回复
为什么没有人回答呢??

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧