想作一个局域网搜索工具但是有问题

fansses 2003-12-08 12:18:13
因为网络是192.和169.二个不同网关的,,

所以不能只搜索192的,
只有一个办法就是搜索网上邻居,
搜索网上邻居具体要怎么做呢?


还有多线程的问题,
是不是得到网上邻居的数量,然后再产生同等数量的线程去搜索?


jessicashiwa@hotmail.com
QQ:3049925
-------------
谢谢,
...全文
41 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zihan 2003-12-10
  • 打赏
  • 举报
回复
采用多线程得方式,通过ping来实现.

1,不要产生太多得线程,最好不要超过500个,你可以在ping一个结束之后,然后ping下一个.

下面是我曾经实现这个得部分代码,有点垃圾,不要见怪.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Thread.h"
#include "Main.h"
#include "stdio.h"
#pragma package(smart_init)
WORD Version=0x0002;
//---------------------------------------------------------------------------

// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TIPScan::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------

__fastcall TIPScan::TIPScan(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TIPScan::Execute()
{
IdClient= new TIdIcmpClient(NULL);
IdClient->OnReply=Reply;
while(!Terminated&&!Finished)
TestIP();
delete IdClient;
Form1->StartScan->Enabled=true;
Form1->StopScan->Enabled=false;
//---- Place thread code here ----
}
//---------------------------------------------------------------------------
void __fastcall TIPScan::TestIP(void)
{
if(Form1->IPList->Strings[0]=="")
{
Finished=true;
return;
}
AnsiString Host;
Host=Form1->IPList->Strings[0];
Form1->IPList->Delete(0);
Ping(Host);
}
//---------------

void __fastcall TIPScan::Ping(AnsiString h)
{
IdClient->Host=h;
IdClient->ReceiveTimeout=2000;
IdClient->BufferSize=100;
Form1->SeSkinStatusBar1->Panels->Items[0]->Text="正在测试:"+h+".....";
IdClient->Ping();
}

void __fastcall TIPScan::Reply(TComponent *ASender,const TReplyStatus &AReplyStatus)
{
if((AReplyStatus.FromIpAddress==IdClient->Host)&&AReplyStatus.BytesReceived>0)
{
int TTL = AReplyStatus.TimeToLive;
if(TTL < 45)
System = "Windows9X";
else if(TTL < 150)
System = "Windows2K/NT/XP";
else
System = "UNIX";
Name=GetName(IdClient->Host);
MACAddress=FindMACAddress(IdClient->Host);
Synchronize(DisPlay);
}
}
//-------------
void __fastcall TIPScan::DisPlay(void)
{
int Count=Form1->SeSkinSListView1->Items->Count;
Form1->SeSkinSListView1->AddItem(IdClient->Host,NULL);
Form1->SeSkinSListView1->Items->Item[Count]->SubItems->Add(System);
Form1->SeSkinSListView1->Items->Item[Count]->SubItems->Add(Name);
Form1->SeSkinSListView1->Items->Item[Count]->SubItems->Add(MACAddress);
}
//---------------------------------------
AnsiString __fastcall TIPScan::FindMACAddress(AnsiString Host)
{
AnsiString msg;
char Mac[30];
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, *PASTAT;
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
char tmp[40];
Mac[0]='\0';
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios( &ncb );
if (uRetCode!=0)
{
strcat(Mac,"Init Error!");
return Mac;
}
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
strcpy((char *)ncb.ncb_callname, Host.c_str());
ncb.ncb_buffer =(unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
if (uRetCode == 0 )
{
sprintf(Mac, "%02X%02X%02X%02X%02X%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]);
return Mac;
}
else
{
strcat(Mac,"Unknown.");
return Mac;
}
}
AnsiString __fastcall TIPScan::GetName(AnsiString Host)
{
AnsiString Text;
int iReturn=SocketInitialize();
if(iReturn==0)
Text=ResolveIP(Host);
SocketClose();
return Text;
}
int __fastcall TIPScan::SocketInitialize()
{
int iReturn=WSAStartup(Version,&wsData);
if(iReturn==ERROR_SUCCESS&&wsData.wVersion==Version)
return iReturn;
else
return iReturn+1;
}
void __fastcall TIPScan::SocketClose()
{
if(WSAIsBlocking())
WSACancelBlockingCall();
WSACleanup();
}
AnsiString __fastcall TIPScan::ResolveIP(AnsiString Host)
{
unsigned int addr;
hostent *hostname;
addr = inet_addr((char FAR *)Host.c_str());
hostname = gethostbyaddr((char *)&addr, 4, AF_INET|AF_IPX);
if (hostname == NULL)
return "Unknown";
else
return hostname->h_name;

}
过客猫2022 2003-12-10
  • 打赏
  • 举报
回复
你查查win api里面有相关的函数
zzbluecat 2003-12-10
  • 打赏
  • 举报
回复
不需要使用PING的办法,在WINNET SDK中有如下函数:
WNetOpenEnum
WNetEnumResource
WNetCloseEnum
具体代码在MSDN里有,我摘抄如下:
BOOL WINAPI EnumerateFunc(HWND hwnd,
HDC hdc,
LPNETRESOURCE lpnr)
{
DWORD dwResult, dwResultEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384; // 16K is a good size
DWORD cEntries = -1; // enumerate all possible entries
LPNETRESOURCE lpnrLocal; // pointer to enumerated structures
DWORD i;
//
// Call the WNetOpenEnum function to begin the enumeration.
//
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, // all network resources
RESOURCETYPE_ANY, // all resources
0, // enumerate all resources
lpnr, // NULL first time the function is called
&hEnum); // handle to the resource

if (dwResult != NO_ERROR)
{
//
// Process errors with an application-defined error handler.
//
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum");
return FALSE;
}
//
// Call the GlobalAlloc function to allocate resources.
//
lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
if (lpnrLocal == NULL)
return FALSE;

do
{
//
// Initialize the buffer.
//
ZeroMemory(lpnrLocal, cbBuffer);
//
// Call the WNetEnumResource function to continue
// the enumeration.
//
dwResultEnum = WNetEnumResource(hEnum, // resource handle
¢ries, // defined locally as -1
lpnrLocal, // LPNETRESOURCE
&cbBuffer); // buffer size
//
// If the call succeeds, loop through the structures.
//
if (dwResultEnum == NO_ERROR)
{
for(i = 0; i < cEntries; i++)
{
// Call an application-defined function to
// display the contents of the NETRESOURCE structures.
//
DisplayStruct(hdc, &lpnrLocal[i]);

// If the NETRESOURCE structure represents a container resource,
// call the EnumerateFunc function recursively.

if(RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage
& RESOURCEUSAGE_CONTAINER))
if(!EnumerateFunc(hwnd, hdc, &lpnrLocal[i]))
TextOut(hdc, 10, 10, "EnumerateFunc returned FALSE.", 29);
}
}
// Process errors.
//
else if (dwResultEnum != ERROR_NO_MORE_ITEMS)
{
NetErrorHandler(hwnd, dwResultEnum, (LPSTR)"WNetEnumResource");
break;
}
}
//
// End do.
//
while(dwResultEnum != ERROR_NO_MORE_ITEMS);
//
// Call the GlobalFree function to free the memory.
//
GlobalFree((HGLOBAL)lpnrLocal);
//
// Call WNetCloseEnum to end the enumeration.
//
dwResult = WNetCloseEnum(hEnum);

if(dwResult != NO_ERROR)
{
//
// Process errors.
//
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetCloseEnum");
return FALSE;
}

return TRUE;
}
constantine 2003-12-09
  • 打赏
  • 举报
回复
http://www.ccrun.com/doc/go.asp?id=430
看看这里,或许对你有用
fansses 2003-12-09
  • 打赏
  • 举报
回复
up again
constantine 2003-12-08
  • 打赏
  • 举报
回复
不懂,帮你顶
fansses 2003-12-08
  • 打赏
  • 举报
回复
up

1,317

社区成员

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

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