📄 dnswatchdlg.cpp
字号:
//
// DNSWatchDlg.cpp : implementation file
// Bill Nolde billnolde@ieee.org BillCo Systems 2002 version 1.1
//
#include "stdafx.h"
#include "DNSWatch.h"
#include "DNSWatchDlg.h"
#include <winsock2.h>
#include <MSTcpIP.h>
#include "IPStructs.h"
#include "ipadddel.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT DoRawListen(void *pptr);
int GetDNSName(char *lpDNSName, char *DottedName);
#define MAXPACKETSIZE 1600
#define SELECTARRAYSIZE 200
extern CDNSWatchDlg *MYdlg;
int hSHandle;
//CString szMsg;
BOOLEAN IsListening = FALSE;
bool DoBeep = true;
/////////////////////////////////////////////////////////////////////////////
// CDNSWatchDlg dialog
CDNSWatchDlg::CDNSWatchDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDNSWatchDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDNSWatchDlg)
m_status = _T("");
m_number_received = 0;
m_save_filename = _T("");
m_save_file_text = _T("");
m_total_requests = 0;
m_append_box = FALSE;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDNSWatchDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDNSWatchDlg)
DDX_Control(pDX, IDC_COMBO1, m_ip_address_box);
DDX_Control(pDX, IDC_EDIT5, m_total_requests_ctrl);
DDX_Control(pDX, IDC_BUTTON5, m_beep_button);
DDX_Control(pDX, IDC_EDIT3, m_number_received_ctrl);
DDX_Control(pDX, IDC_LIST2, m_dns_name_list);
DDX_Text(pDX, IDC_EDIT2, m_status);
DDX_Text(pDX, IDC_EDIT3, m_number_received);
DDX_Text(pDX, IDC_EDIT4, m_save_filename);
DDX_Text(pDX, IDC_STATIC1, m_save_file_text);
DDX_Text(pDX, IDC_EDIT5, m_total_requests);
DDX_Check(pDX, IDC_CHECK1, m_append_box);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDNSWatchDlg, CDialog)
//{{AFX_MSG_MAP(CDNSWatchDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnStartButton)
ON_BN_CLICKED(IDC_BUTTON2, OnStopButton)
ON_BN_CLICKED(IDC_BUTTON4, OnSaveListButton)
ON_BN_CLICKED(IDC_BUTTON5, OnBeepButton)
ON_BN_CLICKED(IDC_BUTTON3, OnAboutButton)
ON_BN_CLICKED(IDC_BUTTON6, OnResetButton)
ON_BN_CLICKED(IDC_BUTTON7, OnSaveSelectedButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDNSWatchDlg message handlers
BOOL CDNSWatchDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
char szMsg[120];
struct WSAData zWSAData ;
int rc = WSAStartup ( 0x0101 , &zWSAData );
if ( rc ) {
if ( rc == WSASYSNOTREADY ) wsprintf ( szMsg , "Drivers Not Loaded!!" );
else wsprintf ( szMsg , "Start up Error %d", rc );
MessageBox (szMsg, "Winsock Init Error",MB_OK);
return 1;
}
char windir[64];
GetEnvironmentVariable("windir",windir,64);
m_save_filename = "\\temphosts";
m_number_received = 0;
m_total_requests = 0;
UpdateData(FALSE);
ip_entry iptable[100]; //Table of strucures containing IP addresses and subnet masks
int nNumberOfIPs = GetAllIPAddresses( &iptable[0],100);
for (int i=0; i< nNumberOfIPs; i++)
m_ip_address_box.AddString (iptable[i].ip_address);
m_ip_address_box.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CDNSWatchDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CDNSWatchDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//--------------------------------------------------------------
void CDNSWatchDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
//--------------------------------------------------------------
void CDNSWatchDlg::OnStartButton()
{
UINT (AFX_CDECL *MyThread)(LPVOID);
#define IP_HDRINCL 2 /* header is included with data */
int rc;
struct sockaddr_in sa_in;
DWORD dwBytesReturned=0;
DWORD dwBufferLen;
ULONG rcvall = 1;
int on = 1;
CString szMsg;
if (IsListening == TRUE) {
MessageBeep(100);
return;
}
UpdateData(TRUE);
m_status.Empty();
hSHandle = WSASocket ( AF_INET, SOCK_RAW , 0 , NULL,0,WSA_FLAG_OVERLAPPED );
if ( hSHandle == SOCKET_ERROR ) {
szMsg.Format("socket() failed, errno=%d", WSAGetLastError());
MessageBox(szMsg,"socket",MB_OK);
return;
}
// int bufsize = 32000;
// rc = setsockopt(hSHandle,IPPROTO_RAW, SO_RCVBUF ,(char*)&bufsize,sizeof(int));
// if ( rc == SOCKET_ERROR ) {
// szMsg.Format("SetSockOpt RECVBUSSIZE Failed eroro = %d", GetLastError());
// closesocket(hSHandle);
// MessageBox(szMsg,"setsockopt",MB_OK);
// return;
// }
sa_in.sin_family = AF_INET;
sa_in.sin_port = 0;
CString csIP;
int nDx = m_ip_address_box.GetCurSel();
m_ip_address_box.GetLBText(nDx,csIP);
sa_in.sin_addr.s_addr = inet_addr(csIP);
rc = bind ( hSHandle, (struct sockaddr *) &sa_in , sizeof( sa_in ) );
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format( "bind() failed, errno=%d", rc );
MessageBox(szMsg,"BIND",MB_OK);
closesocket ( hSHandle );
return;
}
}
rc = WSAIoctl(hSHandle, SIO_RCVALL, &rcvall, sizeof(ULONG), &dwBufferLen,
sizeof(dwBufferLen),&dwBytesReturned, NULL, NULL);
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format("Ioctl() failed, errno=%d\n", rc );
MessageBox (szMsg, "Network Ioctl",MB_OK);
}
}
IsListening = TRUE;
m_status.Format("Initialization OK Up and listening...");
MyThread = (DoRawListen);
AfxBeginThread (MyThread , NULL );
UpdateData(FALSE);
}
//---------------------------------------------------------------
void CDNSWatchDlg::OnStopButton()
{
UpdateData(TRUE);
closesocket ( hSHandle );
m_status = "Not Listening";
UpdateData(FALSE);
IsListening = FALSE;
}
//----------------------------------------------------------------
void CDNSWatchDlg::AddName(CString name_to_add)
{
char iTemp[32];
itoa(++m_total_requests,iTemp,10);
m_total_requests_ctrl.SetWindowText(iTemp);
int nDx = m_dns_name_list.FindStringExact (0, name_to_add);
if ( nDx != LB_ERR ) return; //already in list
m_dns_name_list.AddString(name_to_add);
itoa(++m_number_received,iTemp,10);
m_number_received_ctrl.SetWindowText(iTemp);
}
//---------------------------------------------------------------
UINT DoRawListen(void *pptr)
{
#define DNSPORT 53
#define MAXDNSNAMESIZE 1024
struct sockaddr saddr;
int rc,fromlen=sizeof(struct sockaddr);
PIPHEADER iphdr;
char buf[MAXPACKETSIZE],add_name[MAXDNSNAMESIZE];
CString szMsg;
while(1) {
if (IsListening == FALSE) break;
rc = recvfrom( hSHandle ,buf,MAXPACKETSIZE,NULL, &saddr, &fromlen);
if ( rc == SOCKET_ERROR ) {
rc = WSAGetLastError();
if ( rc != WSAEINPROGRESS ) {
szMsg.Format("recvfrom() failed, error =%d", rc );
return 1;;
}
}
// Your Filter goes here. Don't do too much processing,
// or you may drop packets
iphdr = (PIPHEADER) buf;
int dsnport = htons(DNSPORT);
if ((iphdr->UDP_src_port == dsnport) ||
(iphdr->UDP_DEST_port == dsnport)) {
if (DoBeep ==true) MessageBeep(5000);
GetDNSName(&iphdr->data[12], add_name);
MYdlg->AddName(add_name);
}
}
closesocket ( hSHandle );
AfxEndThread(0);
return 0;
}
//------------------------------------------------------------
//This is code I ripped out af anothe application I did. The format of
// the DNS name in the request packet is in the form of
//length followed by the name. a Zero length denotes end of DNS name
//------------------------------------------------------------
int GetDNSName(char *lpDNSName, char *DottedName)
{
int tot_len, len;
char *ptr1, *ptr2;
ptr1 = lpDNSName;
ptr2 = DottedName;
*ptr2 = 0;
if ( *ptr1 == 0 ) return 0;
tot_len = 0;
while ( 1 ) {
if ( *ptr1 == 0 ) break;
len = (int) *ptr1++;
tot_len += len+1;
for (int i=0; i<len; i++)
*ptr2++ = *ptr1++;
*ptr2++ = '.';
}
*ptr2--;
*ptr2 = 0;
return tot_len+1;
}
//--------------------------------------------------------------------------
void CDNSWatchDlg::OnSaveListButton()
{
UpdateData(TRUE);
if (IsListening == TRUE) {
m_status = "Stop Listening first";
UpdateData(FALSE);
return;
}
if ( m_save_filename.IsEmpty() == TRUE) {
MessageBeep(10);
m_status = "No File Name";
UpdateData(FALSE);
return;
}
int count = m_dns_name_list.GetCount();
int sel_array[SELECTARRAYSIZE];
for (int i=0; i<count;i++) sel_array[i] = i;
int rc = SaveNames(count, sel_array);
if (rc ==0)
m_status = "File Saved";
else
m_status = "Error Saving file";
UpdateData(FALSE);
}
//--------------------------------------------------------------------------
int CDNSWatchDlg::SaveNames ( int nbr_to_save, int save_index[] )
{
FILE *fh;
int rc,count;
CString ctemp;
UpdateData(TRUE);
if (m_append_box == TRUE)
fh = fopen (m_save_filename,"a+");
else fh = fopen (m_save_filename,"w");
if ( fh == NULL ) return 1; //No default param file
count = m_dns_name_list.GetCount();
for (int i=0; i<nbr_to_save; i++ ){
m_dns_name_list.GetText(save_index[i], ctemp);
ctemp = "127.0.0.1 " + ctemp + "\n"; //create hosts entry
rc = fwrite (ctemp,1,ctemp.GetLength(),fh);
}
fclose (fh );
return 0;
}
//-------------------------------------------------------------------
void CDNSWatchDlg::OnBeepButton()
{
if ( DoBeep == true ) {
m_beep_button.SetWindowText ("No Beep");
DoBeep = false;
}
else {
m_beep_button.SetWindowText ("Beep");
DoBeep = true;
}
}
//-------------------------------------------------------------------
void CDNSWatchDlg::OnAboutButton()
{
CString zMsg= " Bill Nolde \n"
" BillCo Systems 2001\n"
" billnolde@ieee.org\n"
" DNS Watcher Application 1.2\n";
MessageBox(zMsg, "Another one of Mr. Bill's network programs",MB_OK);
}
//---------------------------------------------------------
void CDNSWatchDlg::OnResetButton()
{
m_save_filename = "C:\\temphosts";
m_number_received = 0;
m_total_requests = 0;
m_dns_name_list.ResetContent();
UpdateData(FALSE);
}
//---------------------------------------------------------
void CDNSWatchDlg::OnSaveSelectedButton()
{
int sel_array[SELECTARRAYSIZE],count = m_dns_name_list.GetSelCount();
m_dns_name_list.GetSelItems(100,sel_array);
int rc = SaveNames(count, sel_array);
if (rc ==0)
m_status = "File Saved";
else
m_status = "Error Saving file";
UpdateData(FALSE);
}
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -