大概思路是:获取本主机IP,然后将它和子网掩码进行与操作,可知道子网的主机号范围,然后逐个进行Ping,最多ping4次。
ping是基于icmp报文的,它被封装在ip中发送出去。
主要问题是,这样单线程Ping速度真的非常慢,所以我尝试了多线程,不过过程并不顺利,主要是在recvIcmp过程中,内部或许有些更复杂的步骤。
不过,有个简单的实现方法是通过system函数调用DOS指令ping,并将它的输出重定向,然后检索一下输出结果就好了,只是楼主比较执着于自己实现ping功能。
这个ping是我一个p2p局域网通信的子功能,接下来先写syn端口嗅探咯,回头再优化ping。
.完整的代码就不贴出来了,不过核心的就这些
先获取本主机IP,这个结构和winpcap很相似,用过的大哥应该都清楚。
PIP_ADAPTER_INFO pAdapterInfo = nullptr;
PIP_ADAPTER_INFO pCurrAdater = nullptr;
// 假设设备只有一个
unsigned long adapterSum = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
if (pAdapterInfo == nullptr)
{
AfxMessageBox((LPCTSTR)"malloc failed, in const std::vector& CNetTrans::GetHostname()");
}
// 如果获取过程返回ERROR_BUFFER_OVERFLOW, 说明分配的内存不够,这是adapterSum被修改为适合的大小
if (GetAdaptersInfo(pAdapterInfo, &adapterSum) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = nullptr;
// 分配合适的内存
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(adapterSum);
if (pAdapterInfo == nullptr)
{
AfxMessageBox((LPCTSTR)"malloc failed, in CNetTrans::GetHostname()");
}
}
char description[256];
char ip[16];
char netmask[16];
char gate[16];
if (GetAdaptersInfo(pAdapterInfo, &adapterSum) != NO_ERROR)
{
AfxMessageBox((LPCTSTR)"GetAdapterInfo error, in CNetTrans::GetHostname()");
}
pCurrAdater = pAdapterInfo;
while (pCurrAdater)
{