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);