首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎样检测主机上的端口是否开放解决方案

2012-03-12 
怎样检测主机上的端口是否开放我想写一个程序,隔一段时间去扫描一下几台主机的端口是否工作正常(比如80端

怎样检测主机上的端口是否开放
我想写一个程序,隔一段时间去扫描一下几台主机的端口是否工作正常(比如80端口、1433端口等),不知用何控件比较简单实现。有源代码就更好啦

[解决办法]
http://download.csdn.net/source/1625991

这里有个现成的 嘿嘿。
[解决办法]

C/C++ code
//---------------------------------------#ifndef uGetAllListH#define uGetAllListH#include "iphlpapi.h"#include "winsock.hpp"#pragma link "C:\\Program Files\\Borland\\CBuilder6\\Lib\\Psdk\\iphlpapi.lib"//---------------------------------------String strTcpState[] ={    "未知状态", "已经关闭", "监听中", "同步发送",    "同步接收", "已建立", "FIN_WAIT", "FIN_WAIT2",    "等待关闭", "正在关闭", "LAST_ACK", "超时", "DELETE_TCB"};static PMIB_TCPTABLE pTcpTable;static PMIB_UDPTABLE pUdpTable;//---------------------------------------// 解析IP,根据IP地址获取主机名称String __fastcall GetHost(UINT unIpAddr){    PHostEnt pHostEnt;    TInAddr iaInAddr;    String strRet;    if(unIpAddr == 0)        strRet = "0.0.0.0";    else    {        Application->ProcessMessages();        iaInAddr.S_un.S_addr = unIpAddr;        strRet = strRet.sprintf("%d.%d.%d.%d",                BYTE(iaInAddr.S_un.S_un_b.s_b1),                BYTE(iaInAddr.S_un.S_un_b.s_b2),                BYTE(iaInAddr.S_un.S_un_b.s_b3),                BYTE(iaInAddr.S_un.S_un_b.s_b4));    }    return strRet;}//---------------------------------------// 根据连接类型,获取端口的描述String __fastcall GetPort(UINT unPort, char *pcProto){    PServEnt pServEnt;    Application->ProcessMessages();    pServEnt = getservbyport(htons(unPort), pcProto);    if(pServEnt != NULL)        return String(unPort) + "(" + String(pServEnt->s_name) + ")";    else        return String(IntToStr(unPort));};//---------------------------------------// 获取TCP链接的信息void __fastcall MyGetTcpTable(TListView *lv){    DWORD dwRetVal;    DWORD dwLocalPort, dwLocalAddr, dwRemotePort, dwRemoteAddr;    if(pTcpTable != NULL)        GlobalFree(pTcpTable);    pTcpTable = (MIB_TCPTABLE *)GlobalAlloc(GMEM_SHARE, sizeof(MIB_TCPTABLE));    DWORD dwSize = 0;    // Make an initial call to GetTcpTable to    // get the necessary size into the dwSize variable    if(GetTcpTable(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)    {        GlobalFree(pTcpTable);        pTcpTable = (MIB_TCPTABLE *)GlobalAlloc(GMEM_SHARE, (UINT)dwSize);    }    // Make a second call to GetTcpTable to get    // the actual data we require    dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE);    if(dwRetVal== NO_ERROR)    {        for(int i = 0; i < (int) pTcpTable->dwNumEntries; i++)        {            dwLocalPort = pTcpTable->table[i].dwLocalPort / 256 +                    (pTcpTable->table[i].dwLocalPort % 256) * 256;            dwLocalAddr = pTcpTable->table[i].dwLocalAddr;            dwRemotePort = pTcpTable->table[i].dwRemotePort / 256 +                    (pTcpTable->table[i].dwRemotePort % 256) * 256;            dwRemoteAddr = pTcpTable->table[i].dwRemoteAddr;            TListItem *pItem = lv->Items->Add();            pItem->Caption = String(i + 1);            pItem->SubItems->Add("TCP");            pItem->SubItems->Add(GetHost(dwLocalAddr) + ":" + String(dwLocalPort));            pItem->SubItems->Add(GetHost(dwRemoteAddr) + ":" + String(dwRemotePort));            pItem->SubItems->Add(strTcpState[pTcpTable->table[i].dwState]);            pItem->ImageIndex = pTcpTable->table[i].dwState == 11 ? 1: 0;            pItem->SubItems->Add("本地端口:" + GetPort(dwLocalPort, "TCP") +                    "  远程端口:" + GetPort(dwRemotePort, "TCP"));        }    }    else    {        MessageBox(Application->Handle, SysErrorMessage(GetLastError()).c_str() ,            Application->Title.c_str(), MB_OK | MB_ICONERROR);    }}//---------------------------------------// 获取UDP连接的信息void __fastcall MyGetUdpTable(TListView *lv){    DWORD dwRetVal;    DWORD dwLocalPort, dwLocalAddr;    if(pUdpTable != NULL)        GlobalFree(pUdpTable);    pUdpTable = (MIB_UDPTABLE *)GlobalAlloc(GMEM_SHARE, sizeof(MIB_UDPTABLE));    DWORD dwSize = 0;    // Make an initial call to GetTcpTable to    // get the necessary size into the dwSize variable    if(GetUdpTable(pUdpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)    {        GlobalFree(pUdpTable);        pUdpTable = (MIB_UDPTABLE *)GlobalAlloc(GMEM_SHARE, (UINT)dwSize);    }    // Make a second call to GetUdpTable to get    // the actual data we require    dwRetVal = GetUdpTable(pUdpTable, &dwSize, TRUE);    if(dwRetVal == NO_ERROR)    {        for(int i = 0; i < (int)pUdpTable->dwNumEntries; i++)        {            dwLocalPort = pUdpTable->table[i].dwLocalPort / 256 +                    (pUdpTable->table[i].dwLocalPort % 256) * 256;            dwLocalAddr = pUdpTable->table[i].dwLocalAddr;            TListItem *pItem = lv->Items->Add();            pItem->Caption = String(lv->Items->Count);            pItem->SubItems->Add("UDP");            pItem->SubItems->Add(GetHost(dwLocalAddr) + ":" + String(dwLocalPort));            pItem->SubItems->Add("*.*.*.*:*");            pItem->SubItems->Add(strTcpState[pTcpTable->table[i].dwState]);            pItem->ImageIndex = 2;            pItem->SubItems->Add("本地端口:" + GetPort(dwLocalPort, "UDP"));        }    }    else    {        MessageBox(Application->Handle, SysErrorMessage(GetLastError()).c_str() ,            Application->Title.c_str(), MB_OK | MB_ICONERROR);    }}//---------------------------------------// 删除链接bool __fastcall MyDeleteConnection(int nIndex){    pTcpTable->table[nIndex].dwState = MIB_TCP_STATE_DELETE_TCB;    DWORD dwResult = SetTcpEntry(&pTcpTable->table[nIndex]);    if(dwResult == NO_ERROR)    {        MessageBox(Application->Handle, "删除连接成功!",                Application->Title.c_str(), MB_OK | MB_ICONINFORMATION);        return true;    }    else    {        MessageBox(Application->Handle, "删除连接失败,该状态的连接不可删除!",                Application->Title.c_str(), MB_OK | MB_ICONERROR);        return false;    }} 


[解决办法]
与目标机器的端口尝试连接即可。如果连接失败,则认为是该端口处于关闭状态。
[解决办法]
扫描端口的方法可多了,针对TCP和UDP端口的方式也有不同之处,针对Windows和UNIX操作系统的端口扫描技术也有不同。

热点排行