C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[324] Unique String 만들기
유영인 [Chris] [cuperido] 8058 읽음    2002-04-04 15:44
간혹 네트워크 처리에서 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);

}

+ -

관련 글 리스트
324 Unique String 만들기 유영인 [Chris] 8058 2002/04/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.