📄 unit1.cpp
字号:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
extern void AnimateShowForm(TForm*);
typedef DWORD WINAPI (*GGetTcpTable)(PMIB_TCPTABLE,PDWORD,BOOL);
typedef DWORD WINAPI (*GGetUdpTable)(PMIB_UDPTABLE,PDWORD,BOOL);
//---------------------------------------------------------------------------
VOID CALLBACK ChangeImage(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
static int index=0;
//bool delay=false;
Form1->ILIcq->Draw(Form1->SBAbout->Canvas,0,0,index,true);
Form1->SBAbout->Invalidate();
index++;
if(index>2)
index=0;
}
unsigned long ServerToIp(char*_GServer)
{
unsigned long ip;
hostent *host;
if((ip=inet_addr(_GServer))==INADDR_NONE)
{
host=gethostbyname(_GServer);
if(host)
ip=*((unsigned long*)host->h_addr_list[0]);
else
return INADDR_NONE;
}
return ip;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WSAData wsa;
if(WSAStartup(0x101,&wsa))
MessageBox(Handle,"Winsock版本不可用!\n后续操作将无法进行!","",MB_OK|MB_ICONINFORMATION);
skTrace=INVALID_SOCKET;
datalen=0;
dataTime=0;
ZeroMemory(szBuffer,DataSize);
IsScan=FALSE;
SetTimer(Handle,100,500,(TIMERPROC)ChangeImage);
ZeroMemory(¬ify,sizeof(notify));
notify.cbSize =sizeof(notify);
notify.hWnd =Handle;
notify.uID =1;
notify.uFlags =NIF_ICON|NIF_MESSAGE|NIF_TIP;
notify.uCallbackMessage =WM_SHELLICON;
notify.hIcon =Icon->Handle;
strcpy(notify.szTip,"TraceIcq+");
Shell_NotifyIcon(NIM_ADD,¬ify);
Application->OnMinimize =Mini;
IsMini=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bbTraceClick(TObject *Sender)
{
AnsiString asError;
BOOL bReUse=1;
if(skTrace!=INVALID_SOCKET)
{
WSAAsyncSelect(skTrace,Handle,0,0);
closesocket(skTrace);
skTrace=INVALID_SOCKET;
}
try
{
iPort=edPort->Text.ToInt();
if(iPort<=0||iPort>65535)
throw 1;
sock.sin_family=AF_INET;
sock.sin_port=htons(iPort);
if(CBAuto->Checked)
sock.sin_addr.s_addr=LocalIp();
else
sock.sin_addr.s_addr=inet_addr(EDHost->Text.c_str());
if(sock.sin_addr.s_addr==INADDR_NONE)throw 2;
EDHost->Text =inet_ntoa(sock.sin_addr);
skTrace=socket(AF_INET,SOCK_DGRAM,0);
if(skTrace==INVALID_SOCKET)
throw 3;
if(setsockopt(skTrace,SOL_SOCKET,SO_REUSEADDR,(char*)&bReUse,sizeof(bReUse))==SOCKET_ERROR)
throw 4;
if(bind(skTrace,(sockaddr*)&sock,sizeof(sock))==SOCKET_ERROR)
throw 5;
if(WSAAsyncSelect(skTrace,Handle,WM_TRACEICQ,FD_READ|FD_CLOSE)==SOCKET_ERROR)
throw 6;
bbTrace->Enabled =false;
bbCancel->Enabled =true;
EDHost->Enabled =false;
edPort->Enabled =false;
mmResult->Lines->Add("已经进入监听模式!");
PCTrace->ActivePage =TabSheet1;
dataTime=0;
return;
}
catch(int Err)
{
switch(Err)
{
case 1:asError="错误的端口号\n端口号必须为1-65535";break;
case 2:asError="获取本机IP失败!";break;
case 3:asError="Winsock错误!\n创建套接字失败!";break;
case 4:asError="Winsock错误!\n设置套接字选项失败!";break;
case 5:asError="与本地名字绑定失败!\n请确认所用的IP是否有效!\n建议选中自动获取IP!";break;
case 6:asError="Winsock错误!\n无法进入消息模式!";break;
}
MessageBox(Handle,asError.c_str(),"",MB_OK|MB_ICONINFORMATION);
}
catch(...){MessageBox(Handle,"错误的端口号\n端口号必须为1-65535","",MB_OK|MB_ICONINFORMATION);}
if(skTrace!=INVALID_SOCKET)closesocket(skTrace);
skTrace=INVALID_SOCKET;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(skTrace)bbCancelClick(NULL);
if(IsScan)BBEndClick(NULL);
KillTimer(Handle,100);
Shell_NotifyIcon(NIM_DELETE,¬ify);
WSACleanup();
}
//---------------------------------------------------------------------------
u_long TForm1::LocalIp()
{
char szhBuffer[1024];
hostent*host;
try
{
if(gethostname(szhBuffer,1023)==SOCKET_ERROR)
throw 1;
host=gethostbyname(szhBuffer);
if(host==NULL)throw 2;
return *((u_long*)host->h_addr_list[0]);
}
catch(...)
{
return INADDR_NONE;
}
}
void __fastcall TForm1::OnTrace(TMessage& Msg)
{
static AnsiString asZero=AnsiString("");
sockaddr_in sockin;
int sockinlen;
char szErrorBuf[56];
if(skTrace==INVALID_SOCKET)return;
dataTime++;
PCTrace->ActivePage =TabSheet1;
if(WSAGETSELECTERROR(Msg.LParam))
{
if(WSAGETSELECTERROR(Msg.LParam)==WSAENOTSOCK)return;
wsprintf(szErrorBuf,"网络错误,错误码:%d!",WSAGetLastError());
mmResult->Lines->Add(szErrorBuf);
if(CBContinue->Checked)
bbTraceClick(NULL);
else
bbCancelClick(NULL);
return;
}
if(WSAGETSELECTEVENT(Msg.LParam)==FD_READ)
{
ZeroMemory(szBuffer,DataSize);
sockinlen=sizeof(sockin);
datalen=recvfrom(skTrace,szBuffer,DataSize,0,(sockaddr*)&sockin,&sockinlen);
if(datalen>0)
{
wsprintf(szText,
"IP:%s端口:%d数据:%d字节",
inet_ntoa(sockin.sin_addr),
ntohs(sockin.sin_port),
datalen);
mmResult->Lines->Add(szText);
if(RBBinary->Checked)
RBBinaryClick(NULL);
else
RBTextClick(NULL);
if(!CBContinue->Checked||dataTime>RepeatTime)
bbCancelClick(NULL);
}
else if(datalen==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAENOTSOCK)return;
wsprintf(szErrorBuf,"网络错误,错误码:%d!",WSAGetLastError());
mmResult->Lines->Add(szErrorBuf);
if(CBContinue->Checked&&dataTime<RepeatTime)
bbTraceClick(NULL);
else
bbCancelClick(NULL);
return;
}
}
else
bbCancelClick(NULL);
//bbCancelClick(NULL);
}
void __fastcall TForm1::bbCancelClick(TObject *Sender)
{
WSAAsyncSelect(skTrace,Handle,0,0);
closesocket(skTrace);
skTrace=INVALID_SOCKET;
bbTrace->Enabled =true;
bbCancel->Enabled =false;
edPort->Enabled =true;
if(!CBAuto->Checked)EDHost->Enabled =true;
dataTime=0;
mmResult->Lines->Add("已经退出监听模式!");
PCTrace->ActivePage =TabSheet1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
AnimateShowForm(this);
SBAbout->Invalidate();
Label1->Invalidate();
Bevel1->Invalidate();
Bevel2->Invalidate();
PCTrace->ActivePage=TabSheet1;
int j;
for(j=0;j<=16;j++)
SGData->Cells[j][0]=IntToStr(j);
for(j=0;j<256;j++)
SGData->Cells[0][j]=IntToStr(j);
u_long lip=LocalIp();
in_addr inaddr;
inaddr.s_addr=lip;
if(lip!=INADDR_NONE)EDHost->Text =inet_ntoa(inaddr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CBAutoClick(TObject *Sender)
{
EDHost->Enabled =!CBAuto->Checked;
if(!CBAuto->Checked)ShowMessage("除非你的机器是多IP的电脑\n否则建议你选中自动获取IP\n以便程序自动获取IP");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SBAboutClick(TObject *Sender)
{
ShellAbout(Handle,"TraceIcq+","作者:Bcbhua\n欢迎访问LoveBcb.yeah.net",Icon->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BBTcpClick(TObject *Sender)
{
//TCP
#define TcpNum 256
HINSTANCE hInst=LoadLibrary("iphlpapi.dll");
GGetTcpTable GetTcp;
DWORD dwSize=sizeof(MIB_TCPROW)*TcpNum+sizeof(DWORD);
char* cTmp=new char[dwSize];
TListItem*list;
in_addr inaddr;
AnsiString asState;
ZeroMemory(cTmp,dwSize);
PMIB_TCPTABLE pTcp=(PMIB_TCPTABLE)cTmp;
try
{
if(hInst==NULL)
throw 1;
GetTcp=(GGetTcpTable)GetProcAddress(hInst,"GetTcpTable");
if(GetTcp==NULL)
throw 2;
if(GetTcp(pTcp,&dwSize,FALSE))
{
delete[]cTmp;
cTmp=new char[dwSize];
pTcp=(PMIB_TCPTABLE)cTmp;
if(GetTcp(pTcp,&dwSize,FALSE))throw 3;
}
for(DWORD i=0;i<pTcp->dwNumEntries;i++)
{
list=LVTable->Items->Add();
inaddr.s_addr=pTcp->table[i].dwLocalAddr;
list->Caption=AnsiString(inet_ntoa(inaddr));
list->SubItems->Add(ntohs(pTcp->table[i].dwLocalPort));
if(pTcp->table[i].dwState==MIB_TCP_STATE_ESTAB)
{
inaddr.s_addr=pTcp->table[i].dwRemoteAddr;
list->SubItems->Add(inet_ntoa(inaddr));
list->SubItems->Add(ntohs(pTcp->table[i].dwRemotePort));
}
else
{
list->SubItems->Add("------");
list->SubItems->Add("------");
}
switch(pTcp->table[i].dwState)
{
case MIB_TCP_STATE_CLOSED:asState="已关闭";break;
case MIB_TCP_STATE_CLOSING:asState="正在关闭";break;
case MIB_TCP_STATE_CLOSE_WAIT:asState="等待关闭";break;
case MIB_TCP_STATE_DELETE_TCB:asState="删除";break;
case MIB_TCP_STATE_ESTAB:asState="已连接";break;
case MIB_TCP_STATE_FIN_WAIT1:asState="第一次握手";break;
case MIB_TCP_STATE_FIN_WAIT2:asState="第二次握手";break;
case MIB_TCP_STATE_LAST_ACK:asState="最后确认";break;
case MIB_TCP_STATE_LISTEN:asState="监听...";break;
case MIB_TCP_STATE_SYN_RCVD:asState="同步接收";break;
case MIB_TCP_STATE_SYN_SENT:asState="同步发送";break;
case MIB_TCP_STATE_TIME_WAIT:asState="超时等待";break;
default:asState="未知状态";break;
}
list->SubItems->Add(asState);
}
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::BBUdpClick(TObject *Sender)
{
//UDP
#define UdpNum 256
HINSTANCE hInst=LoadLibrary("iphlpapi.dll");
GGetUdpTable GetUdp;
DWORD dwSize=sizeof(MIB_UDPROW)*UdpNum+sizeof(DWORD);
char* cTmp=new char[dwSize];
TListItem*list;
in_addr inaddr;
AnsiString asState;
ZeroMemory(cTmp,dwSize);
PMIB_UDPTABLE pUdp=(PMIB_UDPTABLE)cTmp;
try
{
if(hInst==NULL)
throw 1;
GetUdp=(GGetUdpTable)GetProcAddress(hInst,"GetUdpTable");
if(GetUdp==NULL)
throw 2;
if(GetUdp(pUdp,&dwSize,FALSE))
{
delete[]cTmp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -