一个简单的ping程序 提问

yxwsbobo 2010-05-23 09:53:49
Windows网络与通信程序设计 中的一个例子,ping程序,可是用他我只能ping 127.0.0.1, ping 百度谷歌之类的就超时,这是为什么?




#include <stdio.h>


CInitSock theSock;//Socket初始化工作


typedef struct icmp_hdr
{
unsigned char icmp_type; // 消息类型
unsigned char icmp_code; // 代码
unsigned short icmp_checksum; // 校验和
// 下面是回显头
unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID
unsigned short icmp_sequence; // 序列号
unsigned long icmp_timestamp; // 时间戳
} ICMP_HDR, *PICMP_HDR;


int main()
{
// 目的IP地址,即要Ping的IP地址
char szDestIp[] = "60.28.14.158"; // 127.0.0.1

// 创建原始套节字
SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

// 设置接收超时
SetTimeout(sRaw, 1000, TRUE);


// 设置目的地址
SOCKADDR_IN dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(0);
dest.sin_addr.S_un.S_addr = inet_addr(szDestIp);

// 创建ICMP封包
char buff[sizeof(ICMP_HDR) + 32];
ICMP_HDR* pIcmp = (ICMP_HDR*)buff;
// 填写ICMP封包数据
pIcmp->icmp_type = 8; // 请求一个ICMP回显
pIcmp->icmp_code = 0;
pIcmp->icmp_id = (USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum = 0;
pIcmp->icmp_sequence = 0;
// 填充数据部分,可以为任意
memset(&buff[sizeof(ICMP_HDR)], 'E', 32);

// 开始发送和接收ICMP封包
USHORT nSeq = 0;
char recvBuf[1024];
SOCKADDR_IN from;
int nLen = sizeof(from);
while(TRUE)
{
static int nCount = 0;
int nRet;
if(nCount++ == 4)
break;
pIcmp->icmp_checksum = 0;
pIcmp->icmp_timestamp = ::GetTickCount();
pIcmp->icmp_sequence = nSeq++;
pIcmp->icmp_checksum = checksum((USHORT*)buff, sizeof(ICMP_HDR) + 32);
nRet = ::sendto(sRaw, buff, sizeof(ICMP_HDR) + 32, 0, (SOCKADDR *)&dest, sizeof(dest));
if(nRet == SOCKET_ERROR)
{
printf(" sendto() failed: %d \n", ::WSAGetLastError());
return -1;
}
nRet = ::recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&from, &nLen);
if(nRet == SOCKET_ERROR)
{
if(::WSAGetLastError() == WSAETIMEDOUT)
{
printf(" timed out\n");
continue;
}
printf(" recvfrom() failed: %d\n", ::WSAGetLastError());
return -1;
}

// 下面开始解析接收到的ICMP封包
int nTick = ::GetTickCount();
if(nRet < sizeof(IPHeader) + sizeof(ICMP_HDR))
{
printf(" Too few bytes from %s \n", ::inet_ntoa(from.sin_addr));
}
// 接收到的数据中包含IP头,IP头大小为20个字节,所以加20得到ICMP头
ICMP_HDR* pRecvIcmp = (ICMP_HDR*)(recvBuf + 20); // (ICMP_HDR*)(recvBuf + sizeof(IPHeader));
if(pRecvIcmp->icmp_type != 0) // 回显
{
printf(" nonecho type %d recvd \n", pRecvIcmp->icmp_type);
return -1;
}

if(pRecvIcmp->icmp_id != ::GetCurrentProcessId())
{
printf(" someone else's packet! \n");
return -1;
}

printf(" %d bytes from %s:", 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 0;
}


...全文
350 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingyong2003 2010-05-27
  • 打赏
  • 举报
回复
MARK一下, 学习用!!!
这不是鸭头 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hzy694358 的回复:]
牛逼啊,这么多的ping
[/Quote]进来学习这么多ping的...
hzy694358 2010-05-27
  • 打赏
  • 举报
回复
牛逼啊,这么多的ping
bragi523 2010-05-27
  • 打赏
  • 举报
回复
你先用命令ping一下,看时候能排除防火墙等因素
AngelDevil 2010-05-27
  • 打赏
  • 举报
回复
没看代码 不过win7写好像要添加ws2_32.lib  而且设置不了TTL,我写的ping 和 tracert在同学的XP上一切正常 在我的win7上就不行了
liumenghappy 2010-05-25
  • 打赏
  • 举报
回复
向高手学习
d52787790 2010-05-25
  • 打赏
  • 举报
回复
mark下, 直接调用windows的icmp.dll试试?
stjay 2010-05-24
  • 打赏
  • 举报
回复
域名要先转为IP
MoXiaoRab 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]
http://blog.csdn.net/VisualEleven/archive/2010/04/21/5512462.aspx
[/Quote]
书记这个只是用了CMD管道,调用的还是ping.exe

看看这个
sun007700 2010-05-24
  • 打赏
  • 举报
回复
我这边好像可以的。
用cmd ping www.baidu.com

buptzwp 2010-05-24
  • 打赏
  • 举报
回复
mark一下。
stonewater 2010-05-24
  • 打赏
  • 举报
回复
百度之类的肯定限制了,你ping局域网没防火墙的机器试试,你也可以用windows带的ping命令做个比较
Wenxy1 2010-05-24
  • 打赏
  • 举报
回复
能ping通你的LAN中的机器或者网关么?
把你的主机上和网关上的防火墙关闭试试。
wuhuwy 2010-05-24
  • 打赏
  • 举报
回复
帮顶,学习了!
yxwsbobo 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tr0j4n 的回复:]

引用 4 楼 visualeleven 的回复:
http://blog.csdn.net/VisualEleven/archive/2010/04/21/5512462.aspx

书记这个只是用了CMD管道,调用的还是ping.exe

看看这个
[/Quote]


测试结果和书上的一样,可以ping通本地局域网,但是无法ping通外网, IP地址解析都没问题 都是超时
yxwsbobo 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tr0j4n 的回复:]

引用 4 楼 visualeleven 的回复:
http://blog.csdn.net/VisualEleven/archive/2010/04/21/5512462.aspx

书记这个只是用了CMD管道,调用的还是ping.exe

看看这个
[/Quote]



一会测试一下, 不过书上的代码我都看懂了,只是他不能正常工作让我感觉到奇怪而已,能追根求底更好,得不到答案也无妨大碍,我又不会去做ping程序
yxwsbobo 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wenxy1 的回复:]

能ping通你的LAN中的机器或者网关么?
把你的主机上和网关上的防火墙关闭试试。
[/Quote]


在虚拟机XP(192.168.1.102)中 用书上的代码可以ping 通我本机192.168.1.100

但是虚拟机XP一样无法ping百度谷歌之类的,用自带的ping程序 都可以ping通
lijianli9 2010-05-24
  • 打赏
  • 举报
回复
估计是防火墙限制了,你ping下局域网的其他机子可以吗?
yxwsbobo 2010-05-23
  • 打赏
  • 举报
回复
虚拟机XP中 也是超时 晕倒
加载更多回复(2)

18,356

社区成员

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

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