// burn_ht2008.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "burn_ht2008.h"
#include <iostream.h>
#include <winsock.h>
#include <windowsx.h>
#include <stdio.h>
#include "icmpdefs.h"
#include <windows.h>
#include <process.h>
#include "SocketRx.h"
#include "SocketDx.h"
#include "SocketTx.h"
#include <conio.h>
#include <assert.h>
#include <stdlib.h>
#include "Iphlpapi.h"
#pragma comment(lib,"iphlpapi")
#pragma comment(lib,"ws2_32.lib")
#define winsock_version 0x0202
#define IPPORT_TELNET_MA 2323
#define IPPORT_DEFAULT_TELNET 23
char strIP[20] = "192.168.2.2"; <------------------------------ 问题1
char strIP2[20] = "192.168.2.19";
char strIP3[20] = "192.168.2.36";
char strIP4[20] = "192.168.2.53";
char strIP5[20] = "192.168.2.70";
char strIP6[20] = "192.168.2.87";
char strIP7[20] = "192.168.2.104";
char strIP8[20] = "192.168.2.121";
char strIP9[20] = "192.168.2.138";
char strIP10[20] = "192.168.2.155";
char strIP11[20] = "192.168.2.172";
char strIP12[20] = "192.168.2.189";
char strIP13[20] = "192.168.2.206";
char strIP14[20] = "192.168.2.223";
char strIP15[20] = "192.168.2.240";
int nPort = IPPORT_TELNET_MA; //port 2323
int nDefaultPort = IPPORT_DEFAULT_TELNET; //default 23
BOOL fOver1 = TRUE;
BOOL fMac = FALSE;
BOOL fFirstTime = TRUE;
extern bool flagAlready;
extern bool fConfig;
extern bool fError;
HANDLE hThreadPing[15];
WSAData wsaData;
DHCPUserInfo burninfo;
HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");
typedef struct tagThreadData
{
char strIPTh[20];
char* mcid;
PIP_ECHO_REPLY_PING perp;
}THREADDATA;
typedef struct
{
char mcid[9];
char ip[16];
}STBINFO;
STBINFO stb_info[10];
int stb_num;
THREADDATA TD[15];
#define vsnprintf _vsnprintf
#define snprintf _snprintf
static int getTimeStr (char *asctimeBuf)
{
#if 1
struct tm *newtime;
time_t aclock;
time( &aclock ); // Get time in seconds
newtime = localtime( &aclock ); // Convert time to struct tm form
strcpy(asctimeBuf, asctime(newtime));
asctimeBuf[strlen(asctimeBuf) - 1] = '/0';
#else
slogToFile(asctimeBuf, "XXX");
#endif
return 0;
}
static void do_log(const char *fmt, va_list args)
{
char tStr[80];
char *msgbuf;
char *fmtbuf;
#define LOG_MSG_BUF 512
fmtbuf = (char *)malloc(LOG_MSG_BUF * 2);
msgbuf = fmtbuf + LOG_MSG_BUF;
assert(msgbuf);
assert(fmtbuf);
getTimeStr(tStr);
snprintf(fmtbuf, LOG_MSG_BUF, "[%s]: %s", tStr, fmt);
vsnprintf(msgbuf, LOG_MSG_BUF, fmtbuf, args);
FILE *fp = fopen(".//error.log", "a");
if (fp == NULL)
{
fprintf(stderr, msgbuf);
}
else
{
fprintf(fp, msgbuf);
fclose(fp);
}
free(fmtbuf);
}
void logToFile(char *fmt, ...)
{
va_list args;
va_start(args, fmt);
do_log(fmt, args);
va_end(args);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
UINT macIP(char* IP, char *mac_buf)
{
IPAddr ipdest;
ipdest = inet_addr(IP);
ULONG umac = 0;
ULONG ulen = 8;
char buf[256];
char bufint[6][3];
ZeroMemory(buf,256);
ZeroMemory(bufint,18);
//发送ARP查询包获得远程MAC地址
if (NO_ERROR != SendARP(ipdest,0,(PULONG)buf,&ulen))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
logToFile("%s/n",(LPCTSTR)lpMsgBuf);
logToFile("%s/n",(LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
else
{
...
}
return 0;
}
/*ip分成4个数*/
unsigned long __fastcall InvertIp(unsigned long NormalIp)
{
unsigned char b1,b2,b3,b4;
b1 = (unsigned char)NormalIp & 0x00FF;
b2 = (unsigned char)(NormalIp >> 8) & 0x00FF;
b3 = (unsigned char)(NormalIp >> 16) & 0x00FF;
b4 = (unsigned char)(NormalIp >> 24) & 0x00FF;
return (b1 <<24) | (b2 << 16) | (b3 << 8) | b4;
}
UINT ThreadPing(char* IP, PIP_ECHO_REPLY_PING pIpe, char* mac_buf)
{
// 装载ICMP.DLL连接库
if (hIcmp == 0)
{
cerr << "Unable to locate ICMP.DLL!" << endl;
return 1 ;
}
// 定义函数三个指针类型
typedef HANDLE (WINAPI* pfnHV)(VOID);
typedef BOOL (WINAPI* pfnBH)(HANDLE);
typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,PIP_OPTION_INFORMATION_PING, LPVOID, DWORD, DWORD); // evil, no?
//定义三个指针函数
pfnHV pIcmpCreateFile;
pfnBH pIcmpCloseHandle;
pfnDHDPWPipPDD pIcmpSendEcho;
//从ICMP.DLL中得到函数入口地址
pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp, "IcmpCreateFile");
pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle");
pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho");
if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0))
{
cerr << "Failed to get proc addr for function." << endl;
return 3 ;
}
// 打开ping服务
HANDLE hIP = pIcmpCreateFile();
if (hIP == INVALID_HANDLE_VALUE)
{
cerr << "Unable to open ping service." << endl;
return 4;
}
// 构造ping数据包
char acPingBuffer[64];
memset(acPingBuffer, '/xAA', sizeof(acPingBuffer));
pIpe->Data = acPingBuffer;
pIpe->DataSize = sizeof(acPingBuffer);
// 发送ping数据包
DWORD dwStatus = pIcmpSendEcho(hIP, inet_addr(IP), acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, sizeof(IP_ECHO_REPLY_PING) + sizeof(acPingBuffer), 100);
if (dwStatus != 0)
{
macIP(IP, mac_buf);
fOver1 = FALSE;
}
else
{
return -1;
}
return 0;
}
//Multithreading ping
UINT ThreadPingStart1(LPVOID lpParam) <------------------------------ 问题2
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.2");
}
}
return 0;
}
UINT ThreadPingStart2(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.19");
}
}
return 0;
}
UINT ThreadPingStart3(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.36");
}
}
return 0;
}
UINT ThreadPingStart4(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.53");
}
}
return 0;
}
UINT ThreadPingStart5(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.70");
}
}
return 0;
}
UINT ThreadPingStart6(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.87");
}
}
return 0;
}
UINT ThreadPingStart7(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.104");
}
}
return 0;
}
UINT ThreadPingStart8(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.121");
}
}
return 0;
}
UINT ThreadPingStart9(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.138");
}
}
return 0;
}
UINT ThreadPingStart10(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.155");
}
}
return 0;
}
UINT ThreadPingStart11(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.172");
}
}
return 0;
}
UINT ThreadPingStart12(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
{
Sleep(1000);
}
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.189");
}
}
return 0;
}
UINT ThreadPingStart13(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.206");
}
}
return 0;
}
UINT ThreadPingStart14(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
// logToFile("pData->mcid=%p/n", pData->mcid);
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 17)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.223");
}
}
return 0;
}
UINT ThreadPingStart15(LPVOID lpParam)
{
THREADDATA* pData = (THREADDATA*)lpParam;
char PingIP[16];
strcpy(PingIP, pData->strIPTh);
int i = 0;
in_addr ia;
unsigned long FirstIp;
while(1)
{
FirstIp = inet_addr(PingIP);
FirstIp = InvertIp(FirstIp);
ia.S_un.S_addr = InvertIp(++FirstIp);
ThreadPing(PingIP, pData->perp, pData->mcid);
for(;;)
{
if(fOver1)
{
break;
}
else
Sleep(1000);
}
i++;
if (i != 15)
strcpy(PingIP ,inet_ntoa(ia));
else
{
i = 0;
strcpy(PingIP, "192.168.2.240");
}
}
return 0;
}
BURN_DLL_API void HT_InitBurn()
{
unsigned int id1; <------------------------------ 问题3
unsigned int id2;
unsigned int id3;
unsigned int id4;
unsigned int id5;
unsigned int id6;
unsigned int id7;
unsigned int id8;
unsigned int id9;
unsigned int id10;
unsigned int id11;
unsigned int id12;
unsigned int id13;
unsigned int id14;
unsigned int id15;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
{
exit(0);
}
strcpy(TD[0].strIPTh, strIP); <------------------------------ 问题4
strcpy(TD[1].strIPTh, strIP2);
strcpy(TD[2].strIPTh, strIP3);
strcpy(TD[3].strIPTh, strIP4);
strcpy(TD[4].strIPTh, strIP5);
strcpy(TD[5].strIPTh, strIP6);
strcpy(TD[6].strIPTh, strIP7);
strcpy(TD[7].strIPTh, strIP8);
strcpy(TD[8].strIPTh, strIP9);
strcpy(TD[9].strIPTh, strIP10);
strcpy(TD[10].strIPTh, strIP11);
strcpy(TD[11].strIPTh, strIP12);
strcpy(TD[12].strIPTh, strIP13);
strcpy(TD[13].strIPTh, strIP14);
strcpy(TD[14].strIPTh, strIP15);
<------------------------------ 问题5
TD[0].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[1].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[2].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[3].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[4].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[5].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[6].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[7].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[8].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[9].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[10].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[11].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[12].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[13].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
TD[14].perp = (PIP_ECHO_REPLY_PING)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,sizeof(PIP_ECHO_REPLY_PING) + 64);
<------------------------------ 问题6
hThreadPing[0] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart1,
(void *)&TD[0],
CREATE_SUSPENDED,
&id1);
hThreadPing[1] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart2,
(void *)&TD[1],
CREATE_SUSPENDED,
&id2);
hThreadPing[2] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart3,
(void *)&TD[2],
CREATE_SUSPENDED,
&id3);
hThreadPing[3] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart4,
(void *)&TD[3],
CREATE_SUSPENDED,
&id4);
hThreadPing[4] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart5,
(void *)&TD[4],
CREATE_SUSPENDED,
&id5);
hThreadPing[5] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart6,
(void *)&TD[5],
CREATE_SUSPENDED,
&id6);
hThreadPing[6] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart7,
(void *)&TD[6],
CREATE_SUSPENDED,
&id7);
hThreadPing[7] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart8,
(void *)&TD[7],
CREATE_SUSPENDED,
&id8);
hThreadPing[8] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart9,
(void *)&TD[8],
CREATE_SUSPENDED,
&id9);
hThreadPing[9] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart10,
(void *)&TD[9],
CREATE_SUSPENDED,
&id10);
hThreadPing[10] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart11,
(void *)&TD[10],
CREATE_SUSPENDED,
&id11);
hThreadPing[11] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart12,
(void *)&TD[11],
CREATE_SUSPENDED,
&id12);
hThreadPing[12] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart13,
(void *)&TD[12],
CREATE_SUSPENDED,
&id13);
hThreadPing[13] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart14,
(void *)&TD[13],
CREATE_SUSPENDED,
&id14);
hThreadPing[14] = (HANDLE)_beginthreadex( NULL,
0,
(unsigned int (__stdcall *)(void *))ThreadPingStart15,
(void *)&TD[14],
CREATE_SUSPENDED,
&id15);
}
BURN_DLL_API bool HT_GetMCID(char* mcid)
{
int tTime = 0;
if (stb_num == 9)
stb_num = 0;
fOver1 = TRUE;
TD[0].mcid = mcid; <------------------------------ 问题7
TD[1].mcid = mcid;
TD[2].mcid = mcid;
TD[3].mcid = mcid;
TD[4].mcid = mcid;
TD[5].mcid = mcid;
TD[6].mcid = mcid;
TD[7].mcid = mcid;
TD[8].mcid = mcid;
TD[9].mcid = mcid;
TD[10].mcid = mcid;
TD[11].mcid = mcid;
TD[12].mcid = mcid;
TD[13].mcid = mcid;
TD[14].mcid = mcid;
// logToFile("===burn %p/n", TD[13].mcid);
if (fFirstTime)
{
ResumeThread(hThreadPing[0]); <------------------------------ 问题8
ResumeThread(hThreadPing[1]);
ResumeThread(hThreadPing[2]);
ResumeThread(hThreadPing[3]);
ResumeThread(hThreadPing[4]);
ResumeThread(hThreadPing[5]);
ResumeThread(hThreadPing[6]);
ResumeThread(hThreadPing[7]);
ResumeThread(hThreadPing[8]);
ResumeThread(hThreadPing[9]);
ResumeThread(hThreadPing[10]);
ResumeThread(hThreadPing[11]);
ResumeThread(hThreadPing[12]);
ResumeThread(hThreadPing[13]);
ResumeThread(hThreadPing[14]);
fFirstTime = FALSE;
}
for(;;)
{
if (fMac)
{
fMac = FALSE;
return TRUE;
}
else
{
tTime++;
if (tTime == 25)
{
fOver1 = FALSE;
return FALSE;
}
Sleep(1000);
}
}
}
BURN_DLL_API int HT_Burn(DHCPUserInfo *duserinfo)
{
SOCKET hSocket;
HANDLE hThread[2];
int port;
char telnetIP[16];
strcpy(burninfo.userid, duserinfo->userid);
strcpy(burninfo.userpin, duserinfo->userpin);
burninfo.nettype = duserinfo->nettype;
strcpy(burninfo.domain, duserinfo->domain);
strcpy(burninfo.dns1, duserinfo->dns1);
strcpy(burninfo.dns2, duserinfo->dns2);
if (burninfo.nettype == 2)
{
strcpy(burninfo.pppoe_username, duserinfo->pppoe_username);
strcpy(burninfo.pppoe_password, duserinfo->pppoe_password);
if ((strlen(burninfo.pppoe_username) == 0) || (strlen(burninfo.pppoe_password) == 0))
{
return 200;
}
}
else if(burninfo.nettype == 3)
{
strcpy(burninfo.static_ip, duserinfo->static_ip);
strcpy(burninfo.static_submark, duserinfo->static_submark);
strcpy(burninfo.static_gateway, duserinfo->static_gateway);
strcpy(burninfo.static_dns1, duserinfo->static_dns1);
strcpy(burninfo.static_dns2, duserinfo->static_dns2);
if ((strlen(burninfo.static_ip) == 0) ||
(strlen(burninfo.static_submark) == 0) ||
(strlen(burninfo.static_gateway) == 0) ||
(strlen(burninfo.static_dns1) == 0) )
{
return 200;
}
}
fOver1 = FALSE;
/*判断字段*/
if ((strlen(burninfo.domain) == 0) || (strlen(burninfo.userid) == 0) ||
(strlen(burninfo.userpin) == 0) || (burninfo.nettype == 0))
{
return 200;
}
for (int i = 0; i < stb_num; i++)
{
...
}
if (i == stb_num)
{
logToFile("find failed %d/n", stb_num);
return 203;
}
for (int j = 0; j < 2; j++)
{
if (flagAlready)
{
port = nDefaultPort;
}
else
{
port = nPort;
}
flagAlready = false;
CSocketDx SocketDx(telnetIP, port);
hSocket = SocketDx.TelnetConnect();
if (hSocket == NULL)
{
logToFile("Unable To Connect/n");
return 201;
}
CSocketRx SocketRx(hSocket, hThread[0]);
CSocketTx SocketTx(hSocket, hThread[1]);
WaitForMultipleObjects(2, hThread, FALSE, INFINITE);
Sleep(1000);
if (fError)
{
fError = FALSE;
return 205;
}
if (fConfig)
{
fConfig = FALSE;
return 204;
}
}
// logToFile(" To Connect/n");
return 205;
}
BURN_DLL_API void HT_ExitBurn()
{
CloseHandle(hThreadPing[0]); <------------------------------ 问题9
CloseHandle(hThreadPing[1]);
CloseHandle(hThreadPing[2]);
CloseHandle(hThreadPing[3]);
CloseHandle(hThreadPing[4]);
CloseHandle(hThreadPing[5]);
CloseHandle(hThreadPing[6]);
CloseHandle(hThreadPing[7]);
CloseHandle(hThreadPing[8]);
CloseHandle(hThreadPing[9]);
CloseHandle(hThreadPing[10]);
CloseHandle(hThreadPing[11]);
CloseHandle(hThreadPing[12]);
CloseHandle(hThreadPing[13]);
CloseHandle(hThreadPing[14]);
FreeLibrary(hIcmp);
}
臃肿的代码在我们的软件里面比比皆是,上面的例子是比较突出的一个。
这种代码是在多次的修订过程中通过简单的copy and paste产生的。浪费存贮空间(SDRAM、磁盘、flash)还只是小事情,最大的问题是难读,难维护,难扩展。
如上例:
程序的目标其实很简单,通过扫描一段IP地址(192.168.2.1~192.168.2.255)来发现局域网中正在运行的STB,然后试图连接并配置参数。为了提高扫描的效率,开启多个线程来并行工作。
1)为了细分为15个网络段,用了15个字符串变量。
为什么不能用一个大小为15的字符指针数组或2维数组呢?
同时也可以看出作者在手动分网段的时候,颇费思量,其实则完全没有必要,为什么不能通过程序自动计算得到呢?
for (n = 0; n < 15; n++)
IP[n] <= 192.168.2.{2+ (255/15)*n};
2)为了实现15个相同功能的线程,结果写了15个一样样的函数体。(仅少量参数的取值不同而已)
为什么不能用一个函数,通过传递不同的参数值来区别呢?
3~9)完全可以用数组+for循环的方式实现的,结果却写成简单的重复15条语句而已。
试想一下:
a)如果在运行了一段时间后,发现15个线程的效果还不是很理想,需要再调高,作者又将copy & paste多少代码?
另:我们怎么证明15是一个最优解,或是如何找到这个值?大幅度的调整代码怕是很不现实。
b)如果要把网络从192.168.2.1 ~ 192.168.2.255扩展20倍到192.168.1.1~192.168.20.255,作者又将copy & paste多少代码?
c)如果在ThreadPingStart1这个线程里面发现了一个bug,作者是不是要改另外14个地方?
d)如果要大幅度修改ThreadPingStart1的功能,作者copy & paste的同时恐怕很难保证在其他14个地方的没有遗漏——将参数也跟着调整过来。
e)如果有多个客户,每个客户的网段大小不一样,是不是应该提供多个不同的版本?针对这样的需求,作者该如何做呢?在现有的模式下,恐怕只有copy成多个文件然后在每个文件中定制修改来实现。这个工作量不仅仅是惊人,而且相当枯燥无趣。
反之,如果通过宏来控制可变的参数,则只需要修改宏重新编译就可。甚至连文件都不用修改,直接在Makefile里面批量改变CC命令行宏参数即可。或者不用宏,用变量,通过main(int argc, char *argv[])从执行码的命令行参数来初始化变量。
总结:
1)机械的copy & paste代码并不能增加软件的价值,相反,软件变的更加糟糕,臃肿,难读,难以维护;最终更没有价值。
2)在计算机软件设计里面,二和无穷大具有同样的属性:重复。故应该遵循同样的处理方式。一旦你发现需要有2个函数实现大致相同的功能的时候,应该考虑(以后)是否还会有第三个或者更多这样的需求,这个时候应停下来思考一下,如何总结、归纳、找到共性: 将变化的量作为参数拎出来,而将不变的架构、流程作为函数体实现。