头文件声明:
class ScanTCPConnect
{
public:
/* @接口 默认构造函数
* @邮箱 575814050@qq.com
* @时间 2018年12月21号
*/
ScanTCPConnect();
/* @接口 默认析构函数
* @邮箱 575814050@qq.com
* @时间 2018年12月21号
*/
~ScanTCPConnect();
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual bool beginScan(ulong);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual bool beginScan(const QString &);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual BoolArr beginScan(ulong, ulong);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual BoolArr beginScan(const ULongArr &);
/* @接口
* @参数
* @返回 bool 成功返回值为true,否则返回值为false
* @作者 杨发荷
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual BoolArr beginScan(const QStringList &);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
virtual void setPortVisable(DoxPortVisable);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年12月18号
*/
virtual void setDoxExtraFunc(const DoxExtraFunc &);
private:
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年10月26号
*/
ulong getTickCountCalibrate();
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
bool scanConnect(sockaddr_in &);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
void printfInfo(const QString &);
/* @接口
* @返回 bool 成功返回值为true,否则返回值为false
* @邮箱 575814050@qq.com
* @时间 2018年2018月12号
*/
void initSockAddr_in(sockaddr_in &, ulong, int);
private:
DoxExtraFunc *m_extraFunc;
};
源文件定义:
ScanTCPConnect::ScanTCPConnect()
: IScanTCPConnect()
, m_extraFunc(NULL)
{
WSADATA WSAData;
if(0 != WSAStartup(MAKEWORD(2, 2), &WSAData))
{
DoxLogger("初始化套接字失败");
}
else { DoxLogger("初始化套接字成功"); }
}
ScanTCPConnect::~ScanTCPConnect()
{
if(m_extraFunc) delete m_extraFunc;
m_extraFunc = NULL; WSACleanup();
}
bool ScanTCPConnect::beginScan(ulong ip)
{
sockaddr_in addr; QString strIP;
Object<IDoxPointer> info(NIL);
for(int idx = 0; idx < 65536; ++idx)
{
if(m_extraFunc && m_extraFunc->pfnProgress)
{
info->setLong(idx);
m_extraFunc->pfnProgress(info);
}
initSockAddr_in(addr, htonl(ip), idx);
if(!scanConnect(addr)) continue;
if(NULL == m_extraFunc) return true;
if(NULL == m_extraFunc->pfnMessage) return true;
in_addr inaddr; inaddr.s_addr = ip;
strIP = QS("%1").arg(inet_ntoa(inaddr));
info->setString(strIP); m_extraFunc->pfnMessage(info);
return true;
}
return false;
}
ulong ScanTCPConnect::getTickCountCalibrate()
{
static ULONG s_ulFirstCallTick = 0;
static LONGLONG s_ullFirstCallTickMS = 0;
SYSTEMTIME systemtime;
FILETIME filetime;
GetLocalTime(&systemtime);
SystemTimeToFileTime(&systemtime, &filetime);
LARGE_INTEGER liCurrentTime;
liCurrentTime.HighPart = filetime.dwHighDateTime;
liCurrentTime.LowPart = filetime.dwLowDateTime;
LONGLONG llCurrentTimeMS = liCurrentTime.QuadPart / 10000;
if(s_ulFirstCallTick == 0)
s_ulFirstCallTick = GetTickCount();
if(s_ullFirstCallTickMS == 0)
s_ullFirstCallTickMS = llCurrentTimeMS;
return s_ulFirstCallTick + (ULONG)(llCurrentTimeMS - s_ullFirstCallTickMS);
}
bool ScanTCPConnect::beginScan(const QString &ip)
{
ulong lip = inet_addr(ip.toLocal8Bit().constData());
return beginScan(lip);
}
bool ScanTCPConnect::scanConnect(sockaddr_in &addr)
{
SOCKET sock;
if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
QString str = QS("%1").arg(inet_ntoa(addr.sin_addr));
printfInfo(str); return false;
}
int retVal = connect(sock, (LPSOCKADDR)&addr, sizeof(addr));
closesocket(sock); return retVal != SOCKET_ERROR;
}
void ScanTCPConnect::printfInfo(const QString &info)
{
if(m_extraFunc && m_extraFunc->pfnMessage)
{
Object<IDoxPointer> ptr(NIL);
ptr->setString(info);
m_extraFunc->pfnMessage(ptr);
}
}
BoolArr ScanTCPConnect::beginScan(const ULongArr &ips)
{
BoolArr flags; Object<IDoxPointer> ptr(NIL);
for(ulong idx = 0; idx < ips.length(); ++idx)
{
if(m_extraFunc && m_extraFunc->pfnProgress)
{
ptr->setLong(idx);
m_extraFunc->pfnProgress(ptr);
}
flags.append(beginScan(ips[idx]));
}
return flags;
}
void ScanTCPConnect::setPortVisable(DoxPortVisable port)
{
}
BoolArr ScanTCPConnect::beginScan(ulong sip, ulong eip)
{
ULongArr ips;
while(sip <= eip) ips.append(sip++);
return beginScan(ips);
}
BoolArr ScanTCPConnect::beginScan(const QStringList &ips)
{
ULongArr lips;
for(int idx = 0; idx < ips.length(); ++idx)
{
QString ip = ips[idx];
ulong lip = inet_addr(ip.toLocal8Bit().constData());
lips.append(lip);
}
return beginScan(lips);
}
void ScanTCPConnect::setDoxExtraFunc(const DoxExtraFunc &syntony)
{
m_extraFunc = new DoxExtraFunc;
m_extraFunc->pfnMessage = syntony.pfnMessage;
m_extraFunc->pfnProgress = syntony.pfnProgress;
}
void ScanTCPConnect::initSockAddr_in(sockaddr_in &addr, ulong ip, int port)
{
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
}
源程序下载地址:https://download.csdn.net/download/yangfahe1/10909507
示例程序运行方式:https://blog.csdn.net/yangfahe1/article/details/84028318