간혹 네트워크 처리에서 Unique String을 만들어야 할 경우가 있습니다. 아래 코드는 자료실의 MAC Address 자료를 참고해서 만든 자료입니다.
절대 겹칠 수 없는 코드를 만들어 냅니다. 원리는 간단하게도 MAC_Address 와 현재의 시간을 문자열화 하여 구하는 방식입니다.
#include <snmp.h>
#include <dos.h>
.
.
.
.
.
String __fastcall TMain::Unique()
{
typedef BOOL(WINAPI * pSnmpExtensionInit) (
IN DWORD dwTimeZeroReference,
OUT HANDLE * hPollForTrapEvent,
OUT AsnObjectIdentifier * supportedView);
typedef BOOL(WINAPI * pSnmpExtensionTrap) (
OUT AsnObjectIdentifier * enterprise,
OUT AsnInteger * genericTrap,
OUT AsnInteger * specificTrap,
OUT AsnTimeticks * timeStamp,
OUT RFC1157VarBindList * variableBindings);
typedef BOOL(WINAPI * pSnmpExtensionQuery) (
IN BYTE requestType,
IN OUT RFC1157VarBindList * variableBindings,
OUT AsnInteger * errorStatus,
OUT AsnInteger * errorIndex);
typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
OUT AsnObjectIdentifier * supportedView);
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionQuery m_Query;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};
UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};
UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};
AsnObjectIdentifier MIB_ifMACEntAddr =
{ sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
AsnObjectIdentifier MIB_ifEntryType =
{sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType};
AsnObjectIdentifier MIB_ifEntryNum =
{sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum};
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = {0, 0};
int ret, dtmp, j = 0;
char TempEthernet[18];
String MAC_ADDRESS = "";
int Count = 0;
String stTString;
char chTString[255];
struct time stTime;
gettime(&stTime);
sprintf(chTString, "%02x%02x%02x%02x", stTime.ti_hour, stTime.ti_min, stTime.ti_sec, stTime.ti_hund);
stTString = chTString;
m_Init = NULL;
m_Query = NULL;
m_hInst = LoadLibrary("inetmib1.dll");
if(m_hInst < (HINSTANCE) HINSTANCE_ERROR) {
m_hInst = NULL;
return("");
}
m_Init = (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_Query = (pSnmpExtensionQuery) GetProcAddress(m_hInst, "SnmpExtensionQuery");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL;
varBindList.len = 1;
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex);
varBindList.len = 2;
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);
do {
ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex);
if(!ret) ret = 1;
else ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength);
if(!ret) {
j++;
dtmp = varBind[0].value.asnValue.number;
if(dtmp == 6) {
ret = SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr, MIB_ifMACEntAddr.idLength);
if((!ret) && (varBind[1].value.asnValue.address.stream != NULL)) {
if((varBind[1].value.asnValue.address.stream[0] == 0x44) &&
(varBind[1].value.asnValue.address.stream[1] == 0x45) &&
(varBind[1].value.asnValue.address.stream[2] == 0x53) &&
(varBind[1].value.asnValue.address.stream[3] == 0x54) &&
(varBind[1].value.asnValue.address.stream[4] == 0x00)) {
continue;
}
if((varBind[1].value.asnValue.address.stream[0] == 0x00) &&
(varBind[1].value.asnValue.address.stream[1] == 0x00) &&
(varBind[1].value.asnValue.address.stream[2] == 0x00) &&
(varBind[1].value.asnValue.address.stream[3] == 0x00) &&
(varBind[1].value.asnValue.address.stream[4] == 0x00) &&
(varBind[1].value.asnValue.address.stream[5] == 0x00)) {
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
MAC_ADDRESS = (String)TempEthernet;
}
}
}
if(++ Count > 10) break;
} while(!ret);
FreeLibrary(m_hInst);
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
return(MAC_ADDRESS + stTString);
}
|