请教一下在VC中如何判断一个ip是否可以PING通?

尘埃黎明 2011-03-24 04:42:39
即bool ping(dword ip)函数如何实现?效率最好高一点,谢谢!
...全文
906 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zamboninite 2012-06-18
  • 打赏
  • 举报
回复
6楼的不错
野男孩 2011-03-25
  • 打赏
  • 举报
回复
来晚了,都答过啦。。。。。

什么叫数据发送不完整???
尘埃黎明 2011-03-25
  • 打赏
  • 举报
回复
还有一个问题,udp非阻塞模式下数据发送不完整,如何解决?阻塞模式下正常
Bit_bbtt 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beyondsky007 的回复:]
IPHlpApi这个库和头文件vc6.0不支持,和GDI+好像也有冲突
[/Quote]

好像得更新下一个MS的SDK
尘埃黎明 2011-03-25
  • 打赏
  • 举报
回复
找到答案了,每次发送完数据调用一次Sleep(1)就行了,不过还是谢谢各位!
尘埃黎明 2011-03-25
  • 打赏
  • 举报
回复
有些数据没发送出去,阻塞模式下所有数据都可以正常发送
Dreadnought 2011-03-24
  • 打赏
  • 举报
回复
InternetCheckConnection
尘埃黎明 2011-03-24
  • 打赏
  • 举报
回复
IPHlpApi这个库和头文件vc6.0不支持,和GDI+好像也有冲突
Bit_bbtt 2011-03-24
  • 打赏
  • 举报
回复
参看以下代码
.h

#include <IPHlpApi.h>
#pragma comment(lib, "iphlpapi.lib")

class CPing
{
public:
CPing(void);
~CPing(void);
private:
HINSTANCE hIcmp;
typedef HANDLE (WINAPI *PIcmpCreateFile)(VOID);
typedef DWORD (WINAPI *PIcmpSendEcho)(HANDLE, IPAddr, LPVOID, WORD, PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);
typedef BOOL (WINAPI *PIcmpCloseHandle)(HANDLE);
PIcmpCreateFile pIcmpCreateFile;
PIcmpSendEcho pIcmpSendEcho;
PIcmpCloseHandle pIcmpCloseHandle;
public:
//功能:ping某个地址或者Ip,返回结果
//参数:v_pszDesAddress-目标域名或者IP
//参数:v_usTimes-需要ping的次数
//参数:v_ulTimeout-超时时间,单位毫秒
//返回值:-1-发生异常,其他大于等于0的值表示未超时的次数
int Ping(const char *v_pszDesAdress, USHORT v_usTimes, ULONG v_ulTimeout);
};


#include "StdAfx.h"
#include ".\ping.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//构造函数
CPing::CPing(void)
{
hIcmp = LoadLibrary("icmp.dll");
if(NULL != hIcmp)
{
pIcmpCreateFile = (PIcmpCreateFile)GetProcAddress(hIcmp, "IcmpCreateFile");
pIcmpSendEcho = (PIcmpSendEcho)GetProcAddress(hIcmp, "IcmpSendEcho");
pIcmpCloseHandle = (PIcmpCloseHandle)GetProcAddress(hIcmp, "IcmpCloseHandle");
}
}
//析构函数
CPing::~CPing(void)
{
FreeLibrary(hIcmp);
}
//功能:ping某个地址或者Ip,返回结果
//参数:v_pszDesAddress-目标域名或者IP
//参数:v_usTimes-需要ping的次数
//参数:v_ulTimeout-超时时间,单位毫秒
//返回值:-1-发生异常,其他大于等于0的值表示未超时的次数
int CPing::Ping(const char *v_pszDesAdress, USHORT v_usTimes, ULONG v_ulTimeout)
{
ULONG ulDesIP = 0;
int ret = 0;

// 当传递的参数为域名时,解析该域名的IP
ulDesIP = inet_addr(v_pszDesAdress);
//域名
if(ulDesIP == INADDR_NONE)
{
// 解析传入域名的IP
PHOSTENT pHostent = gethostbyname(v_pszDesAdress);
if (pHostent == NULL)
{
return -1;
}
ulDesIP = *(DWORD *)pHostent->h_addr;
}

// 申请发送缓冲区
void *sendBuffer = new char[32];
if (sendBuffer == NULL)
{
return -1;
}

// 申请接收缓冲区
unsigned long replySize = sizeof(ICMP_ECHO_REPLY) + 32;
void *replyBuffer = new char[replySize];
if (replyBuffer == NULL)
{
delete [] sendBuffer;
sendBuffer = NULL;
return -1;
}
PICMP_ECHO_REPLY pIcmpEchoReply = (PICMP_ECHO_REPLY)replyBuffer;

// 获取ICMP echo所需句柄
HANDLE hIcmpFile = pIcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
{
delete [] sendBuffer;
sendBuffer = NULL;
delete [] replyBuffer;
replyBuffer = NULL;
return -1;
}

// 调用IcmpSendEcho,获取Ping值
for (int i=0; i<v_usTimes; i++)
{
pIcmpSendEcho(hIcmpFile, ulDesIP, sendBuffer, 32, NULL, replyBuffer, replySize, v_ulTimeout);

if (pIcmpEchoReply->Status == 0) // 未超时
{
ret++;
}
}

//释放缓冲区,关闭句柄
delete[] replyBuffer;
delete[] sendBuffer;
pIcmpCloseHandle(hIcmpFile);

return ret;
}
尘埃黎明 2011-03-24
  • 打赏
  • 举报
回复
如何判断会不会回一个端口不可达的ICMP包?
jwybobo2007 2011-03-24
  • 打赏
  • 举报
回复
发ICMP的ping包

貌似楼上的有直接提供源码的。有的话就直接用吧
lanneret1234 2011-03-24
  • 打赏
  • 举报
回复
发个高端口UDP数据包过去,看会不会回一个端口不可达的ICMP包,有就通没有就不通
Eleven 2011-03-24
  • 打赏
  • 举报
回复
zwfgdlc 2011-03-24
  • 打赏
  • 举报
回复

DWORD SendARP(
__in IPAddr DestIP,
__in IPAddr SrcIP,
__out PULONG pMacAddr,
__inout PULONG PhyAddrLen
);

18,356

社区成员

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

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