主题:求助 补全scan模块的程序 端口扫描的
scan按钮总体实现过程
(1)调用UPDATEDATE(TRUE)函数,更新成员变量。
(2)接着判断输入的断口值,输入端口范围是0-65530,不符合或者开始端口大于结束端口,都回弹出错误信息。
(3)如果符合标准,则开始调用WIN32API的标准创建线程函数AfxBeginThread(),创建一个线程。
(4)然后创建一个定时器SetTimeOut()。
(5)调用AfxSocketInit(),初始化WINSOCKET
(6)初始化成功以后,调用Create元函数,之后后会构造一个socket对象来创建WINDOWS socket ,然后Create会自动调用Bind,把socket和指定的地址绑定,然后socket就会提供SOCK_STREAM和SOCK_GDREAM两种模式。本设计用的是基于TCP的STREAM模式。
(7)成功以后调用Connect(),将套接字S与目标主机建立连接。如果连接成功,则在LIST中输出某某端口已开启。
(8)调用KillTimeOut(),关闭连接,销毁记时器。
(9)delete sock
(10)端口地址自加1。
SCAN按钮主要源程序如下:
this->UpdateData(TRUE);
if(m_EditEndPort>65530)
m_EditEndPort=65530;
else if(m_EditEndPort<1)
m_EditEndPort=1;
if(m_EditStartPort>65530)
m_EditStartPort=65530;
else if(m_EditStartPort<1)
m_EditStartPort=1;
if(m_EditStartPort>m_EditEndPort)
{
AfxMessageBox("开始端口大于结束端口,请重新输入扫描端口段!");
return ;
}
this->UpdateData(FALSE);
scanthread = AfxBeginThread(PortScanThreadProc, this);
UINT PortScanThreadProc(LPVOID pParam)
{
CPortScanView *sview=(CPortScanView *)pParam;
DWORD beginport=sview->m_EditStartPort;
DWORD endport=sview->m_EditEndPort;
CString info;
CString RouteIP;
RouteIP=sview->m_destip;
CTimeOutSocket* sock=NULL;
AfxSocketInit();
while (1)
{
sock = new CTimeOutSocket();
sock->SetTimeOut(5000);
if (!sock->Create())
{
return 1;
}
if (sock->Connect(RouteIP,beginport))
{
info.Format("IP地址:%s 端口%d已开启!",RouteIP,beginport);
sview->m_ListRichEdit.AddString(info);
}
else {
info.Format("IP地址:%s 端口%d未开启!",RouteIP,beginport);
sview->m_ListRichEdit.AddString(info);
}
sock->KillTimeOut();
delete sock;
sock=NULL;
beginport+=1;
if(beginport>endport)
return 0;
}
}
BOOL CTimeOutSocket::SetTimeOut(UINT uTimeOut)
{
m_nTimerID = SetTimer(NULL, 0, uTimeOut, NULL);
return m_nTimerID;
}
BOOL CTimeOutSocket::KillTimeOut()
{
return KillTimer(NULL, m_nTimerID);
(1)调用UPDATEDATE(TRUE)函数,更新成员变量。
(2)接着判断输入的断口值,输入端口范围是0-65530,不符合或者开始端口大于结束端口,都回弹出错误信息。
(3)如果符合标准,则开始调用WIN32API的标准创建线程函数AfxBeginThread(),创建一个线程。
(4)然后创建一个定时器SetTimeOut()。
(5)调用AfxSocketInit(),初始化WINSOCKET
(6)初始化成功以后,调用Create元函数,之后后会构造一个socket对象来创建WINDOWS socket ,然后Create会自动调用Bind,把socket和指定的地址绑定,然后socket就会提供SOCK_STREAM和SOCK_GDREAM两种模式。本设计用的是基于TCP的STREAM模式。
(7)成功以后调用Connect(),将套接字S与目标主机建立连接。如果连接成功,则在LIST中输出某某端口已开启。
(8)调用KillTimeOut(),关闭连接,销毁记时器。
(9)delete sock
(10)端口地址自加1。
SCAN按钮主要源程序如下:
this->UpdateData(TRUE);
if(m_EditEndPort>65530)
m_EditEndPort=65530;
else if(m_EditEndPort<1)
m_EditEndPort=1;
if(m_EditStartPort>65530)
m_EditStartPort=65530;
else if(m_EditStartPort<1)
m_EditStartPort=1;
if(m_EditStartPort>m_EditEndPort)
{
AfxMessageBox("开始端口大于结束端口,请重新输入扫描端口段!");
return ;
}
this->UpdateData(FALSE);
scanthread = AfxBeginThread(PortScanThreadProc, this);
UINT PortScanThreadProc(LPVOID pParam)
{
CPortScanView *sview=(CPortScanView *)pParam;
DWORD beginport=sview->m_EditStartPort;
DWORD endport=sview->m_EditEndPort;
CString info;
CString RouteIP;
RouteIP=sview->m_destip;
CTimeOutSocket* sock=NULL;
AfxSocketInit();
while (1)
{
sock = new CTimeOutSocket();
sock->SetTimeOut(5000);
if (!sock->Create())
{
return 1;
}
if (sock->Connect(RouteIP,beginport))
{
info.Format("IP地址:%s 端口%d已开启!",RouteIP,beginport);
sview->m_ListRichEdit.AddString(info);
}
else {
info.Format("IP地址:%s 端口%d未开启!",RouteIP,beginport);
sview->m_ListRichEdit.AddString(info);
}
sock->KillTimeOut();
delete sock;
sock=NULL;
beginport+=1;
if(beginport>endport)
return 0;
}
}
BOOL CTimeOutSocket::SetTimeOut(UINT uTimeOut)
{
m_nTimerID = SetTimer(NULL, 0, uTimeOut, NULL);
return m_nTimerID;
}
BOOL CTimeOutSocket::KillTimeOut()
{
return KillTimer(NULL, m_nTimerID);