linux socket嗅探,socket实现ping嗅探,获取局域网所有活动主机

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值