求关于扫描一个子网活动IP地址的网络编程

duanyunyuan 2006-06-28 09:23:16
使用ICMP协议中的Echo/Reply实现扫描一个子网,发现该子网中哪些IP地址正在使用,把扫描结果显示在List中。
...全文
413 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wm820712 2006-07-07
  • 打赏
  • 举报
回复

先向某个IP发送ICMP数据报,其中的类型为ICMP_ECHO,然后等待该IP回应ICMP,其类型为ICMP_ECHOREPLY.

如何用socket函数来发送接受ICMP数据报?

1)先打开socket:

SOCKET sockRaw = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,0);

2) 发送数据报

bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest, sizeof(dest));
其中的icmp_data为ICMP数据报, dest为目的地址(通过inet_addr从IP地址获取)

3)接收数据报

bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from, &fromlen);

其中的recvbuf为收到的ICMP数据报,from为发送端的IP
通过这样实现,具体流程怎么样,请问??

jone7319 2006-06-28
  • 打赏
  • 举报
回复
用下面这三个函数来实现

void __fastcall TForm5::ScanNetComputer()
{
Screen-> Cursor=crAppStart;
Computers=new TStringList();
ComputerIp=new TStringList();
EnumNetResource(Computers,NULL,RESOURCE_GLOBALNET,RESOURCETYPE_ANY);
Screen-> Cursor=crDefault;
//??IP??
if(Computers->Count==0) return;
CheckListBox1->Clear();
for(int i=0;i<Computers->Count;i++)
{
Screen-> Cursor=crHourGlass;
AnsiString IP=gethostip(Computers->Strings[i]);
Screen-> Cursor=crDefault;
if(IP!="")
{ComputerIp->Add(IP);
CheckListBox1->Items->Add(Computers->Strings[i]+" (IP="+IP+")");
}
}
}
//---------------------------------------------------------------------------
bool __fastcall TForm5::EnumNetResource(TStrings *rcList,LPNETRESOURCE lpNR, DWORD dwScope,DWORD dwType)
{
HANDLE hEnum = 0; // resource-handle
DWORD dwResult = WNetOpenEnum(
dwScope, // scope of enumeration
dwType, // resource types to list
0, // enumerate all resources
lpNR, // pointer to resource structure (NULL at first time)
&hEnum // handle to resource
) ;
if( dwResult != NO_ERROR ) return false;
bool bRet=true;
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
NETRESOURCE NR[1024];
DWORD dwBuffer=1024*sizeof(NETRESOURCE);
while(1)
{
dwResult = WNetEnumResource(hEnum,&dwEntries,(LPVOID)NR,&dwBuffer) ;
if( dwResult == ERROR_NO_MORE_ITEMS ) break;
else if( dwResult != NO_ERROR ) { bRet=false; break;}
for(DWORD i = 0 ; i < dwEntries ; i++ )
{
if(NR[i].dwDisplayType==RESOURCEDISPLAYTYPE_SERVER)
{
char *p=NR[i].lpRemoteName;
while(*p=='\\') p++;
if(*p) rcList->Add(p);
}
else if((NR[i].dwUsage&RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
{
bRet=EnumNetResource(rcList,&NR[i],dwScope,dwType);
if(bRet==false) break;
}
}
if(bRet==false) break;
}
WNetCloseEnum(hEnum) ;
return bRet;
}


//----------------------------------------------------------
//??????IP??,???????,????????IP??---------

AnsiString __fastcall TForm5::gethostip(AnsiString & host)
{
WSADATA wsaData;
AnsiString IP;
WSAStartup(MAKEWORD(2,0),&wsaData);
if(host.IsEmpty())
{
char hostname[128];
if(gethostname(hostname,128)!=0) return AnsiString("");
host=hostname;
}
try
{
struct hostent *hp=gethostbyname(host.c_str());
if(WSAGetLastError()==WSAHOST_NOT_FOUND)
{
IP="";
return IP;
}
else
IP=inet_ntoa(*(struct in_addr*)hp->h_addr_list[0]);
}
catch(...)
{
IP="";
}
WSACleanup();
return IP;
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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