📄 unit1.cpp
字号:
cTmp=new char[dwSize];
pUdp=(PMIB_UDPTABLE)cTmp;
if(GetUdp(pUdp,&dwSize,FALSE))throw 3;
}
for(DWORD i=0;i<pUdp->dwNumEntries;i++)
{
list=LVTable->Items->Add();
inaddr.s_addr=pUdp->table[i].dwLocalAddr;
list->Caption=AnsiString(inet_ntoa(inaddr));
list->SubItems->Add(ntohs(pUdp->table[i].dwLocalPort));
list->SubItems->Add("--------");
list->SubItems->Add("--------");
list->SubItems->Add("--------");
}
TListItem*nlist=LVTable->Items->Add();
nlist->Caption =AnsiString::StringOfChar('-',list->Caption.Length());
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[0].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[1].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[2].Length()));
nlist->SubItems->Add(AnsiString::StringOfChar('-',list->SubItems->Strings[3].Length()));
}
catch(int Error)
{
switch(Error)
{
case 1:MessageBox(Handle,"无法装载IpHlpApi.dll\n可能系统的版本太低!","",MB_OK|MB_ICONINFORMATION);
case 2:MessageBox(Handle,"无法取出IpHlpApi.dll中的函数地址\n可能系统的版本太低!","",MB_OK|MB_ICONINFORMATION);
default:
list=LVTable->Items->Add();
list->Caption ="--------";
list->SubItems->Add("------");
list->SubItems->Add("--------");
list->SubItems->Add("------");
list->SubItems->Add("------");
}
}
delete[]cTmp;
if(hInst)FreeLibrary(hInst);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BBClearClick(TObject *Sender)
{
LVTable->Items->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RBBinaryClick(TObject *Sender)
{
static AnsiString asZero="";
for(int j=1,total;j<=256;j++)
{
for(int i=1;i<=16;i++)
{
total=(j-1)*16+i-1;
if(total>=datalen)
SGData->Cells[i][j]=asZero;
else
SGData->Cells[i][j]=IntToStr(szBuffer[total]);
}
}
//binary
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RBTextClick(TObject *Sender)
{
static AnsiString asZero="";
for(int j=1,total;j<=256;j++)
{
for(int i=1;i<=16;i++)
{
total=(j-1)*16+i-1;
if(total>=datalen)
SGData->Cells[i][j]=asZero;
else
SGData->Cells[i][j]=AnsiString(szBuffer[total]);
}
}
//text
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
//
if(datalen<=0)
{
ShowMessage("没有数据可以保存!");
return;
}
if(!SDSave->Execute())return;
FILE*fp=fopen(SDSave->FileName.c_str(),"wb+");
if(fp==NULL)
{
ShowMessage("无法打开/创建文件!");
return;
}
fwrite(szBuffer,sizeof(char),datalen,fp);
fclose(fp);
ShowMessage(AnsiString("已经将文件保存到:")+SDSave->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BBScanClick(TObject *Sender)
{
in_addr inaddr;
if(rbAllPort->Checked)
{
NowScanPort=1;
TotalScanPort=65535;
}
else
{
NowScanPort=CheckPort(edFrom);
if(NowScanPort==-1){stbScan->Panels->Items[0]->Text ="端口号最小为1,最大为65535!";return;}
TotalScanPort=CheckPort(edTo);
if(TotalScanPort==-1){stbScan->Panels->Items[0]->Text ="端口号最小为1,最大为65535!";return;}
}
if(MessageBox(Handle,"程序接下来将要解析目标主机的地址,可能会使程序暂时没有反应!\n要继续吗?","提醒",MB_YESNO|MB_ICONQUESTION)==ID_YES)
{
try
{
stbScan->Panels->Items[0]->Text="解析目标主机的地址......";
if(rbLocal->Checked)
RemoteAddr=LocalIp();
else
RemoteAddr=ServerToIp(edRemote->Text.c_str());
if(RemoteAddr==INADDR_NONE)throw 1;
inaddr.s_addr=RemoteAddr;
asRemoteName=AnsiString(inet_ntoa(inaddr));
stbScan->Panels->Items[0]->Text =asRemoteName;
sockRemote.sin_family =AF_INET;
sockRemote.sin_addr.s_addr=RemoteAddr;
sockRemoteLen=sizeof(sockRemote);
for(int i=0;i<AddrBufferSize;i++)
skRemote[i]=INVALID_SOCKET;
IsScan=true;
for(int i=0;i<AddrBufferSize;i++)
{
skRemote[i]=socket(AF_INET,SOCK_STREAM,0);
if(skRemote[i]==INVALID_SOCKET)break;
sockRemote.sin_port =htons(NowScanPort);
if(WSAAsyncSelect(skRemote[i],Handle,WM_ADDRREADY,FD_CONNECT)==SOCKET_ERROR||(connect(skRemote[i],(sockaddr*)&sockRemote,sockRemoteLen)==SOCKET_ERROR&&WSAGetLastError()!=WSAEWOULDBLOCK))
{closesocket(skRemote[i]);skRemote[i]=INVALID_SOCKET;break;}
else
portRemote[i]=NowScanPort++;
if(NowScanPort>TotalScanPort)break;
}
stbScan->Panels->Items[1]->Text=NowScanPort;
LBResult->Items->Clear();
BBScan->Enabled =false;
BBEnd->Enabled=true;
}
catch(...)
{
stbScan->Panels->Items[0]->Text ="无法解析出主机的地址!";
}
}
//
}
//---------------------------------------------------------------------------
int TForm1::CheckPort(TEdit*ted)
{
try
{
ted->Text=ted->Text.Trim();
int iport=ted->Text.Length();
if(iport==0||iport>5)return -1;
iport=ted->Text.ToInt();
if(iport>65535||iport<=0)return -1;
return iport;
}
catch(...){}
return -1;
}
void __fastcall TForm1::OnAddrReady(TMessage&Msg)
{
//TODO: Add your source code here
static SOCKET skNow;
static int skIndex;
skNow=(SOCKET)Msg.WParam;
for(skIndex=0;skIndex<AddrBufferSize;skIndex++)
if(skRemote[skIndex]==skNow)break;
if(skIndex>=AddrBufferSize)return;
if(WSAGETSELECTERROR(Msg.LParam))
{
switch(WSAGETSELECTERROR(Msg.LParam))
{
case WSAECONNREFUSED:
closesocket((SOCKET)Msg.WParam);
skRemote[skIndex]=INVALID_SOCKET;
if(NowScanPort>TotalScanPort)break;
skRemote[skIndex]=socket(AF_INET,SOCK_STREAM,0);
if(skRemote[skIndex]==INVALID_SOCKET)break;
sockRemote.sin_port=htons(NowScanPort);
if(WSAAsyncSelect(skRemote[skIndex],Handle,WM_ADDRREADY,FD_CONNECT)==SOCKET_ERROR||(connect(skRemote[skIndex],(sockaddr*)&sockRemote,sockRemoteLen)==SOCKET_ERROR&&WSAGetLastError()!=WSAEWOULDBLOCK))
{
closesocket(skRemote[skIndex]);
skRemote[skIndex]=INVALID_SOCKET;
}
else
portRemote[skIndex]=NowScanPort++;
stbScan->Panels->Items[1]->Text=NowScanPort;
break;
case WSAENETUNREACH:
closesocket((SOCKET)Msg.WParam);
skRemote[skIndex]=INVALID_SOCKET;
stbScan->Panels->Items[0]->Text="无法访问网络!";
break;
default:
closesocket((SOCKET)Msg.WParam);
skRemote[skIndex]=INVALID_SOCKET;
stbScan->Panels->Items[0]->Text="未知的网络错误!";
break;
}
CheckEnd();
return;
}
LBResult->Items->Add(AnsiString("主机:")+asRemoteName+"端口:"+portRemote[skIndex]+"开放!");
closesocket((SOCKET)Msg.WParam);
skRemote[skIndex]=INVALID_SOCKET;
if(NowScanPort>TotalScanPort)
{
CheckEnd();
return;
}
skRemote[skIndex]=socket(AF_INET,SOCK_STREAM,0);
if(skRemote[skIndex]==INVALID_SOCKET)return;
sockRemote.sin_port=htons(NowScanPort);
if(WSAAsyncSelect(skRemote[skIndex],Handle,WM_ADDRREADY,FD_CONNECT)==SOCKET_ERROR||(connect(skRemote[skIndex],(sockaddr*)&sockRemote,sockRemoteLen)==SOCKET_ERROR&&WSAGetLastError()!=WSAEWOULDBLOCK))
{
closesocket(skRemote[skIndex]);
skRemote[skIndex]=INVALID_SOCKET;
}
else
portRemote[skIndex]=NowScanPort++;
stbScan->Panels->Items[1]->Text=NowScanPort;
CheckEnd();
}
void __fastcall TForm1::BBEndClick(TObject *Sender)
{
for(int i=0;i<AddrBufferSize;i++)
{
if(skRemote[i]!=INVALID_SOCKET)closesocket(skRemote[i]);
skRemote[i]=INVALID_SOCKET;
}
BBScan->Enabled=true;
BBEnd->Enabled=false;
stbScan->Panels->Items[0]->Text="扫描结束!";
stbScan->Panels->Items[1]->Text=0;
IsScan=false;
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::CheckEnd(void)
{
static int i;
for(i=0;i<AddrBufferSize;i++)
{
if(skRemote[i]!=INVALID_SOCKET)break;
}
if(i<AddrBufferSize)return false;
BBScan->Enabled=true;
BBEnd->Enabled=false;
stbScan->Panels->Items[0]->Text="扫描结束!";
stbScan->Panels->Items[1]->Text=0;
IsScan=false;
return true;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//
if(IsScan)BBEndClick(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::rbRemoteClick(TObject *Sender)
{
edRemote->Enabled =rbRemote->Checked;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::rbLocalClick(TObject *Sender)
{
edRemote->Enabled =!rbLocal->Checked;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::rbAllPortClick(TObject *Sender)
{
bool isChecked=!rbAllPort->Checked;
edFrom->Enabled =isChecked;
edTo->Enabled =isChecked;
lbTo->Enabled =isChecked;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::rbSelectPortClick(TObject *Sender)
{
bool isChecked=rbSelectPort->Checked;
edFrom->Enabled =isChecked;
edTo->Enabled =isChecked;
lbTo->Enabled =isChecked;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
try
{
if(mmResult->Text.Length()<=0)
{
ShowMessage("没有信息可以保存!");
return;
}
if(!SDSave->Execute())return;
mmResult->Lines->SaveToFile(SDSave->FileName);
}
catch(...)
{ShowMessage("保存文件失败!");}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
mmResult->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShellHandler(TMessage&Msg)
{
if(Msg.LParam==WM_LBUTTONDOWN)
{
if(IsMini)
{
Application->Restore();
ShowWindow(Application->Handle,SW_RESTORE);
SetForegroundWindow(Application->Handle);
IsMini=false;
}
else
{
Application->Minimize();
ShowWindow(Application->Handle,SW_HIDE);
IsMini=true;
}
}
}
void __fastcall TForm1::Mini(TObject*Sender)
{
//TODO: Add your source code here
Application->Minimize();
ShowWindow(Application->Handle,SW_HIDE);
IsMini=true;
}
void __fastcall TForm1::LVTableEditing(TObject *Sender, TListItem *Item,
bool &AllowEdit)
{
AllowEdit=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel6Resize(TObject *Sender)
{
SBAbout->Left=Panel6->Width -SBAbout->Width-5;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -