大概思路是:获取本主机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)
{

本文介绍了一种通过Linux Socket实现局域网主机嗅探的方法,包括获取本机IP、子网掩码,然后利用ICMP协议进行Ping操作。作者提到单线程Ping速度较慢,尝试了多线程但遇到问题,最后选择了通过system函数调用DOS指令来简化实现。代码示例中展示了如何创建原始套接字并发送、接收ICMP请求,以探测局域网中活跃的主机。
最低0.47元/天 解锁文章
2274

被折叠的 条评论
为什么被折叠?



