중요하진 않지만. 나름 알아내느라 신경썼으니 기록해놔야지.

scrollHeight
complete
clientLeft
offsetParent
firstElementChild
offsetWidth
isContentEditable
hidden
lowsrc
previousElementSibling
localName
parentElement
ownerDocument
nodeValue
lastElementChild
height
x
offsetLeft
tagName
className
prefix
innerHTML
border
width
previousSibling
childElementCount
namespaceURI
scrollLeft
longDesc
lastChild
innerText
clientHeight
align
textContent
nextSibling
scrollWidth
useMap
vspace
offsetHeight
name
clientWidth
nodeName
style
lang
src
scrollTop
offsetTop
childNodes
baseURI
nextElementSibling
title
firstChild
hspace
attributes
dataset
isMap
parentNode
alt
clientTop
naturalWidth
tabIndex
naturalHeight
contentEditable
dir
outerHTML
outerText
id
children
nodeType
draggable
y
insertAdjacentHTML
insertAdjacentText
insertAdjacentElement
getAttribute
setAttribute
removeAttribute
getAttributeNode
getElementsByTagName
getAttributeNS
setAttributeNS
removeAttributeNS
getElementsByTagNameNS
getAttributeNodeNS
hasAttribute
hasAttributeNS
focus
blur
scrollIntoView
scrollIntoViewIfNeeded
scrollByLines
scrollByPages
getElementsByClassName
querySelector
querySelectorAll
webkitMatchesSelector
getClientRects
getBoundingClientRect
setAttributeNode
removeAttributeNode
setAttributeNodeNS
contains
insertBefore
replaceChild
removeChild
appendChild
hasChildNodes
cloneNode
normalize
isSupported
hasAttributes
lookupPrefix
isDefaultNamespace
lookupNamespaceURI
addEventListener
removeEventListener
isSameNode
isEqualNode
compareDocumentPosition
dispatchEvent
ELEMENT_NODE
ATTRIBUTE_NODE
TEXT_NODE
CDATA_SECTION_NODE
ENTITY_REFERENCE_NODE
ENTITY_NODE
PROCESSING_INSTRUCTION_NODE
COMMENT_NODE
DOCUMENT_NODE
DOCUMENT_TYPE_NODE
DOCUMENT_FRAGMENT_NODE
NOTATION_NODE
DOCUMENT_POSITION_DISCONNECTED
DOCUMENT_POSITION_PRECEDING
DOCUMENT_POSITION_FOLLOWING
DOCUMENT_POSITION_CONTAINS
DOCUMENT_POSITION_CONTAINED_BY
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Posted by 배트
,
Child Process가 제대로 동작하는지 테스트하기 위해 개발한 클래스.
당연하게도 콘솔이 있는 애플리케이션에게만 사용이 가능하고,
콘솔에다 뭔가를 출력하고 있어야 정상 동작한다고 인식한다.

This class is developed for checking whether an child process is working properly by monitoring its console.
It determines the child process is working properly, if the child process outputs some texts on its console.

for more information, please refer to the following link. This article is based on it.

//////////////////////////////////////////////////////////////////////////
// Copyright(C)2010 All Rights Reserved by Junseok Oh
//
// author: Junseok Oh
// email: batt22@naver.com, swolf22@nate.com, batt842@gmail.com
// 08.Nov.2010
//
// This source code is free to deploy and modify.
// You don't need to keep this license header.
// An acknowledgement is not required.
// Because it's simple. :-)

class ChildProcess {
public:
    ChildProcess() :
        m_bInit(FALSE),
        m_hOutputRead(INVALID_HANDLE_VALUE),
        m_hOutputWrite(INVALID_HANDLE_VALUE),
        m_hInputRead(INVALID_HANDLE_VALUE),
        m_hInputWrite(INVALID_HANDLE_VALUE),
        m_hErrorWrite(INVALID_HANDLE_VALUE),
        m_nShowCmd(SW_SHOWNORMAL),
        m_doMonitor(FALSE),
        m_nMaxSilentPeriod(5000),
        m_bMonitorResult(TRUE),
        m_bVerbose(FALSE),
        m_hReadActionEvent(INVALID_HANDLE_VALUE)
    {
        HANDLE hOutputReadTmp, hInputWriteTmp;
        SECURITY_ATTRIBUTES sa;

        // Set up the security attributes struct.
        sa.nLength= sizeof(SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;

        // Create the child output pipe.
        if (!CreatePipe(&hOutputReadTmp,&m_hOutputWrite,&sa,0))
            return;

        // Create a duplicate of the output write handle for the std error
        // write handle. This is necessary in case the child application
        // closes one of its std output handles.
        if (!DuplicateHandle(GetCurrentProcess(),m_hOutputWrite,
            GetCurrentProcess(),&m_hErrorWrite,0,
            TRUE,DUPLICATE_SAME_ACCESS))
            return;

        // Create the child input pipe.
        if (!CreatePipe(&m_hInputRead,&hInputWriteTmp,&sa,0))
            return;

        // Create new output read handle and the input write handles. Set
        // the Properties to FALSE. Otherwise, the child inherits the
        // properties and, as a result, non-closeable handles to the pipes
        // are created.
        if (!DuplicateHandle(GetCurrentProcess(),hOutputReadTmp,
            GetCurrentProcess(),
            &m_hOutputRead, // Address of new handle.
            0,FALSE, // Make it uninheritable.
            DUPLICATE_SAME_ACCESS))
            return;

        if (!DuplicateHandle(GetCurrentProcess(),hInputWriteTmp,
            GetCurrentProcess(),
            &m_hInputWrite, // Address of new handle.
            0,FALSE, // Make it uninheritable.
            DUPLICATE_SAME_ACCESS))
            return;

        // Close inheritable copies of the handles you do not want to be
        // inherited.
        if (!CloseHandle(hOutputReadTmp))
            return;
        if (!CloseHandle(hInputWriteTmp))
            return;

        m_bInit = TRUE;
    }
    ~ChildProcess()
    {
        if(!m_bInit)
            return;

        CloseHandlesForParent();
        CloseHandlesForChild();
    }

    void SetInfomation( LPCTSTR szCmdLine, LPCTSTR szWorkingDirectory, int nShowCmd )
    {
        if(!m_bInit)
            return;

        _tcscpy_s( m_szCmdLine, MAX_PATH, szCmdLine );
        _tcscpy_s( m_szWorkingDirectory, MAX_PATH, szWorkingDirectory );
        m_nShowCmd = nShowCmd;
    }

    void SetMonitorPolicy( BOOL doMonitor, long nMaxSilentPeriod, BOOL bVerbose=FALSE )
    {
        if(!m_bInit)
            return;

        m_doMonitor = doMonitor;
        m_nMaxSilentPeriod = nMaxSilentPeriod;
        m_bVerbose = bVerbose;
    }



    BOOL CreateProcess()
    {
        int nResult = 0;
        DWORD ExitCode = 0;
        LPTSTR szWorkingDirectory = NULL;

        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        if( _tcslen(m_szWorkingDirectory)>0 )
            szWorkingDirectory = m_szWorkingDirectory;

        ZeroMemory(&si, sizeof(STARTUPINFO));
        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW ;
        si.hStdInput = m_hInputRead;//GetStdHandle(STD_INPUT_HANDLE);
        si.hStdOutput = m_hOutputWrite;//GetStdHandle(STD_OUTPUT_HANDLE);
        si.hStdError = m_hErrorWrite;//GetStdHandle(STD_ERROR_HANDLE);
        si.wShowWindow = m_nShowCmd;

        nResult = ::CreateProcess( NULL, m_szCmdLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE|CREATE_SUSPENDED, NULL, szWorkingDirectory, &si, &pi );
        CloseHandlesForChild();
        if( m_doMonitor )
            CreateThread( NULL, 0, DoMonitorThread, (LPVOID)this, 0, NULL);
        CreateThread( NULL, 0, ReadChildProcessConsoleThread, (LPVOID)this, 0, NULL);
        ResumeThread( pi.hThread );

        m_bMonitorResult = TRUE;

        if (nResult==TRUE)
        {
            while( WaitForSingleObject( pi.hProcess, 100 )==WAIT_TIMEOUT && m_bMonitorResult )
            {};
        }

        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);

        CloseHandlesForParent();

        return nResult&m_bMonitorResult;
    }

private:

    void DoMonitor()
    {
        if(!m_bInit)
            return;

        m_bMonitorResult = TRUE;
        m_hReadActionEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

        while( WaitForSingleObject( m_hReadActionEvent, m_nMaxSilentPeriod )==WAIT_OBJECT_0 )
        {}

        // Timeout or process terminated
        m_bMonitorResult = FALSE;
        CloseHandle( m_hReadActionEvent );
        m_hReadActionEvent = INVALID_HANDLE_VALUE;
    }

    static DWORD WINAPI DoMonitorThread( void* p )
    {
        ((ChildProcess*)p)->DoMonitor();
        return 0;
    }

    void ReadChildProcessConsole()
    {
        if(!m_bInit)
            return;

        const int nBufferSize = 256;
        CHAR lpBuffer[nBufferSize+1];
        DWORD nBytesRead;

        while(TRUE)
        {
            if (!ReadFile(m_hOutputRead,lpBuffer,nBufferSize,&nBytesRead,NULL) || !nBytesRead)
            {
                if (GetLastError() == ERROR_BROKEN_PIPE)
                    break; // pipe done - normal exit path.
            }

            if(m_bVerbose)
            {
                lpBuffer[nBytesRead] = '\0';
                fputs( lpBuffer, stdout );
            }

            if( m_hReadActionEvent!=INVALID_HANDLE_VALUE )
                SetEvent( m_hReadActionEvent );
        }
    }

    static DWORD WINAPI ReadChildProcessConsoleThread( void* p )
    {
        ((ChildProcess*)p)->ReadChildProcessConsole();
        return 0;
    }

    void CloseHandlesForParent()
    {
        if(!m_bInit)
            return;

        if( hOutputRead!=INVALID_HANDLE_VALUE )
        {
            CloseHandle(hOutputRead);
            hOutputRead = INVALID_HANDLE_VALUE;
        }
        if( hInputWrite!=INVALID_HANDLE_VALUE )
        {
            CloseHandle(hInputWrite);
            hInputWrite = INVALID_HANDLE_VALUE;
        }
    }

    void CloseHandlesForChild()
    {
        if(!m_bInit)
            return;

        // Close pipe handles (do not continue to modify the parent).
        // You need to make sure that no handles to the write end of the
        // output pipe are maintained in this process or else the pipe will
        // not close when the child process exits and the ReadFile will hang.
        if( hOutputWrite!=INVALID_HANDLE_VALUE )
        {
            CloseHandle(hOutputWrite);
            hOutputWrite = INVALID_HANDLE_VALUE;
        }
        if( hInputRead!=INVALID_HANDLE_VALUE )
        {
            CloseHandle(hInputRead);
            hInputRead = INVALID_HANDLE_VALUE;
        }
        if( hErrorWrite!=INVALID_HANDLE_VALUE )
        {
            CloseHandle(hErrorWrite);
            hErrorWrite = INVALID_HANDLE_VALUE;
        }
    }

private:
    BOOL m_bInit;

    HANDLE m_hOutputRead, m_hOutputWrite;
    HANDLE m_hInputRead, m_hInputWrite;
    HANDLE m_hErrorWrite;

    TCHAR m_szCmdLine[MAX_PATH];
    TCHAR m_szWorkingDirectory[MAX_PATH];
    int m_nShowCmd;

    BOOL m_doMonitor;
    BOOL m_bMonitorResult;
    BOOL m_bVerbose;
    int m_nMaxSilentPeriod;
    HANDLE m_hReadActionEvent;
};


int _tmain(int argc, _TCHAR* argv[])
{
        BOOL bResult = FALSE;
        ChildProcess childProcess;
        childProcess.SetInfomation( _T("netstat"), _T(""), SW_SHOWNORMAL );
        childProcess.SetMonitorPolicy( TRUE, 4000, TRUE );
        bResult = childProcess.CreateProcess();
}
Posted by 배트
,
이제보니 프롬프트에서 VBS 파일 이름만 입력해도 그냥 실행이 되는구나...
wscript나 cscript는 옵션 줄 때만 필요한 거군.

set WshShell = WScript.CreateObject("WScript.Shell")
set fso = CreateObject("Scripting.FileSystemObject")
 
strDesktop = WshShell.SpecialFolders("Desktop")
strPrograms = WshShell.SpecialFolders("Programs")
strProgramGroup = strPrograms & "\Group"
strCurrFolder = fso.GetParentFolderName(WScript.ScriptFullName)
 
set oShellLinkDesktop = WshShell.CreateShortcut(strDesktop & "\MyApplication.lnk")
oShellLinkDesktop.TargetPath = strCurrFolder & "\MyApplication.exe"
oShellLinkDesktop.WindowStyle = 1
oShellLinkDesktop.Hotkey = ""
oShellLinkDesktop.IconLocation = strCurrFolder & "\MyApplication.exe, 0"
oShellLinkDesktop.Description = "MyApplication"
oShellLinkDesktop.WorkingDirectory = strCurrFolder
oShellLinkDesktop.Save
 
If (fso.FolderExists(strProgramGroup)=False) Then
    fso.CreateFolder(strProgramGroup)
End If
 
set oShellLinkPrograms = WshShell.CreateShortcut(strProgramGroup & "\MyApplication.lnk")
oShellLinkPrograms.TargetPath = strCurrFolder & "\MyApplication.exe"
oShellLinkPrograms.WindowStyle = 1
oShellLinkPrograms.Hotkey = ""
oShellLinkPrograms.IconLocation = strCurrFolder & "\MyApplication.exe, 0"
oShellLinkPrograms.Description = "MyApplication"
oShellLinkPrograms.WorkingDirectory = strCurrFolder
oShellLinkPrograms.Save 
Posted by 배트
,

원문: http://appdeveloper.intel.com/en-us/article/developer-guidelines

Intel AppUpSM developer program 


Developer Guidelines

Submitted by Community Admin on 14 Sep 2009 12:58:40

 

아래는 인텔 AppUpSM 개발자 프로그램을 위한 개발 가이드라인과 제출 요구사항의 개요입니다.

 

Application/Component Requirements Summary

l       코드는 Validation Guidelines 문서의 표준을 만족시켜야 합니다.

l       개발을 가속하고 Validation Process 중에 거부되는 위험을 줄이기 위해, Developer Catalog 있는 컴포넌트의 사용을 권장합니다.

l       오픈소스 애플리케이션을 제외하고, Intel AppUp 개발자 프로그램 SDK 사용해야 합니다.

l       SDK 함께 제공되는 API 지시사항에 부합하게 GUID 사용하시오.

l       코드를 제출하기 전에 면밀히 검사하시오. Mobiln* OS 위해 개발을 한다면, Moblin.org에서 구할 있는 Moblin 준수 테스팅 도구를 사용하시오.

l       애플리케이션을 제출할 , 제출 지시사항을 따르고, 제출 양식에 적절하고 정확한 정보를 적어 제출하시오.

 

Validation Requirements

몇몇의 하시오 하지 마시오 성공적인 검증(Validation) 작업을 준비하는데 도움이 것입니다. 검증 작업에 대해 자세한 정보를 원한다면, Validation Guidelines Validation Process 문서를 보고, Application Readiness Checklist 또는 Component Readiness Checklist 보시오.

 

애플리케이션:

l       다른 회사들의 트레이드 마크들의 사용 권한을 갖고 있는지 보장하시오.

l       애플리케이션을 배포할 권한이 있는지 보장하시오. 오픈소스 애플리케이션만 소스코드를 제출해야 합니다.

l       애플리케이션이 제대로 인스톨되고 동작하며 깨끗하게 제거되는지 보장하시오.

l       UI 깨끗하고 일관성 있는지 보장하시오.

l       애플리케이션을 제출할 적절히 평가하고, 제출 양식에 모든 요구 기준을 포함시키시오.

l       다른 소프트웨어나 네트워크에 해를 끼치는 동작을 허용하지 마시오.

l       사용자의 명시적인 동의 없이 개인 정보를 요구하거나 이용하는 동작을 허용하지 마시오.

l       불쾌한 컨텐츠를 포함시키지 마시오.

l       앱스토어 외부의 판매나 업그레이드, 구매유도를 위한 팝업이나 광고를 포함시키지 마시오.

 

컴포넌트:

l         라이센스 문서를 첨부하시오.

l         API 기술하시오.

l         컴포넌트의 추가 테스트를 위한 적절한 정보를 첨부하시오.

 

How We Test

1.      설치 패키지가 올바른 형식인지 검사합니다.

2.      패키지를 설치합니다.

3.      애플리케이션에 우리의 검증 표준 테스트를 합니다.

4.      깨끗한 제거를 확인하기 위해 애플리케이션을 제거합니다.

Posted by 배트
,
Some source codes which conduct URL decoding are awful!!
Most of them cannot process a UTF-8 encoded 3 bytes character. (frankly, I'm not good at web search.)
One more frankly, I can't guarantee it works well. Sorry all. :-)

CString URLDecode( CString strEncodedText )
{
CString strResult;
wchar_t ch0, ch1, ch2;
wchar_t wch;
TCHAR tch;
int i = 0;

while( i<strEncodedText.GetLength() )
{
tch = strEncodedText.GetAt(i);
if( tch != _T('%') )
{
// a character not encoded
strResult += tch;
i++;
}
else
{
// a character encoded !!
ch0 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
i += 3;

if( ch0 < 0x80 )
// 1 byte for UTF-8
// 0xxx xxxx
wch = ch0;
else
{
if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
continue;

ch1 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
i += 3;

if( ch0 < 0xe0 )
{
// 2 byte for UTF-8
// 110x xxxx 10xx xxxx
wch = ((ch0&0x1f)<<6)
| (ch1&0x3f);
}
else
{
// 3 byte for UTF-8
if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
continue;

ch2 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
i += 3;

// 1110 xxxx 10xx xxxx 10xx xxxx
wch = ((ch0&0x0f)<<12)
| ((ch1&0x3f)<<6)
| (ch2&0x3f);
}
}
strResult += wch;
}
}

return strResult;
}
Posted by 배트
,

인증서는 공개키 기반이기 때문에,
인증서를 발급받은 PC에서 비밀키와 인증서를 Export하여,
다른 PC의 키 체인에 등록하면-
인증서를 재발급할 필요없이 바로 개발이 가능하다.
(물론 보안 이슈는 있겠지만.)
Posted by 배트
,
c를 사용하면서 함수의 다형성을 사용하려면

.c/.cc/.ccp에서 변수와 함수를 static으로 정의한 다음,
static이 아닌 함수 포인터를 정의하여 static 함수의 주소를 기록하고
외부에서는 함수 포인터로 static 함수에 접근한다.

함수 포인터 이름은 고유해야 하며,
어떤 함수 주소를 담느냐에 따라 다형성을 구현할 수 있다.
여러 사람이 모듈별로 코딩 할 때는 나름 유용할 수도...

....에효. 꼭 이러지 않아도 될 듯;;;
Posted by 배트
,
기본 설정 값
Mac/802_11 set CWMin_         31
Mac/802_11 set CWMax_         1023
Mac/802_11 set SlotTime_      0.000020        ;# 20us
Mac/802_11 set SIFS_          0.000010        ;# 10us
Mac/802_11 set PreambleLength_        144             ;# 144 bit
Mac/802_11 set PLCPHeaderLength_      48              ;# 48 bits
Mac/802_11 set PLCPDataRate_  1.0e6           ;# 1Mbps
Mac/802_11 set RTSThreshold_  0               ;# bytes
Mac/802_11 set ShortRetryLimit_       7               ;# retransmittions
Mac/802_11 set LongRetryLimit_        4               ;# retransmissions

임의 설정 값
Mac/802_11 set basiccRate_ 1Mb
Mac/802_11 set dataRate_ 11Mb
Mac/802_11 set RTSThreshold_ 500


런타임 로그 값
rts frame size = 44
rts frame tx time = 0.000352

cts frame size = 38
cts frame tx time = 0.000304

ack frame size = 38
ack frame tx time = 0.000304

TCP Data(MSS=1460)
data packet size = 1520
data frame size = 1578
data frame tx time = 0.001322

TCP ACK
data packet size = 40
data frame size = 98
data frame tx time = 0.000246


그 동안 뺑이치면서 계산한 건 뭐냐....
Posted by 배트
,

네트워크 시뮬레이터

Network Simulators

 

키워드: Networks simulators, 네트워크 시뮬레이터, NS-2, NS2, OPNET, GloMoSim, TOSSIM, NetSim

 

네트워크 시뮬레이터(Network Simulators)

네트워크 시뮬레이터는 실제 동작을 관찰하지 않고, 네트워크의 동작과 영향을 예측하고 분석하기 위한 장치 또는 소프트웨어다. 엔지니어는 이를 이용해서 DDoS와 같이 실제 일어나기 어려운 상황을 구성하거나, 대량의 센서 노드와 같이 비싼 실험 환경을 에뮬레이트하여 그 영향을 예측한다. 특히 새로운 네트워크 프로토콜을 테스트하거나, 기존의 프로토콜에 대한 환경의 영향을 테스트하는데 주로 사용한다.

현상을 검증하는 데는 수학적 분석, 실제 측정, 시뮬레이션 세 가지 접근 방식이 있다. 이 방식을 평가하는 기준은 현실성, 비용, 구현의 세 가지를 든다. 시뮬레이션은 이 세 가지 기준으로 봤을 때, 세 가지 방식 중에서 평균적으로는 가장 우수하다. 또한 시뮬레이션 방식은 연속 시간, 이산 시간, 이산 이벤트 방식으로 나눌 수 있는데, 대부분의 시뮬레이터가 이산시간 이벤트 방식을 이용한다.

일반적인 네트워크 시뮬레이터는 넓은 범위의 네트워크 기술을 포함하고, 노드와 링크를 기본 단위로 하여 복잡한 환경을 구축한다. 계층적인 네트워크 환경을 구성할 수도 있고, PC, 허브, 브릿지, 라우터, 무선 노드, 광케이블, 동축케이블 등의 구성요소를 사용할 수도 있다. 시뮬레이터의 구성요소는 일반적으로 스케쥴러, 프로토콜, 노드, 링크, 패킷으로 이루어져 작은 네트워크부터 대형 네트워크까지 유연하게 구성할 수 있다. 일부 시뮬레이터는 초대형 네트워크 환경을 지원하기도 하고, 어떤 시뮬레이터는 특정 네트워크 장비를 CPU 명령어 단위까지 에뮬레이션하여 아주 미세한 관찰을 가능하게 해주기도 한다.

 

네트워크 시뮬레이터의 종류

l  NS-2 (The Network Simulator -2)
NS-2는 연구용으로 개발된 오픈소스 시뮬레이터다. 현재 연구용으로는 가장 많이 사용되고 있으며, 다양한 분야의 인력들의 참여로 인해 성능과 품질이 우수하고, 다양한 기능을 지원한다. 이산 이벤트 시뮬레이션 방식을 사용하였고, 유무선을 모두 지원하고, 패킷 단위로 동작하며, 필요한 대부분의 프로토콜 레이어를 구현하였다. 오픈소스답게 기능과 네트워크 구성요소들이 철저히 모듈화되어 있어 일반 사용자도 기능을 수정하거나 새로운 프로토콜을 추가하기가 쉽다. 현재 NS-3 버전까지 나와있지만 아직까지 훨씬 많은 사람들이 NS-2를 사용하고 있다. 유닉스 환경의 대부분의 OS 플랫폼을 지원하고, 시뮬레이션 환경 구성에는 TCL이라는 스크립트 언어를 사용하며, NAM(NS AniMator) XGraph 같은 시각화 도구를 제공한다.

l  OPNET
OPNET은 최초의 상업 네트워크 시뮬레이터로써, 현재도 상용 분야에서 가장 높은 점유율을 차지하고 있다. OPNET은 객체 지향적 모델링을 지원하며, 프로세스 모델링, 노드 모델링, 장비 모델링, 네트워크 모델링의 흐름을 따른다. 또한 잘 짜여진 FSM(Finite State Machine)은 세부단계까지 제어가 가능해 거의 모든 상황을 재현할 수 있다. OPNET은 기능 제약 또는 분야에 따라 여러 버전이 존재하며, 자유도가 높은 버전은 모델링 할 수 있는 구성요소들의 소스 코드를 완전히 개방하여 사용자의 자유도를 최대로 보장하고 있다. 또한 현존하는 거의 모든 프로토콜을 지원하며, 표준장비의 라이브러리를 제공하고, 시뮬레이션 환경 개발에서 분석까지의 전 과정을 GUI 도구를 통해서 편리하게 할 수 있다. 이는 대부분의 윈도우 플랫폼과 솔라리스 플랫폼을 지원한다.

l  GloMoSim
GloMoSim은 대형 시뮬레이션 환경을 위해 개발되었다. 이는 병렬 컴퓨팅을 위한 이산 이벤트 컴퓨팅 시뮬레이터인 Parsec을 이용하여 개발하였다. 다른 시뮬레이터와 유사하게 OSI 계층에 따라 프로토콜을 모듈화하여 개발하였으며, 현재는 무선 네트워크만 지원한다.

l  TOSSIM
TOSSIM(TinyOS Simulator)은 센서 네트워크에 사용하는 못(Mote) OS TinyOS를 에뮬레이션하여 어플리케이션의 동작과 하드웨어의 영향을 분석하는 소프트웨어이다. 이는 엄밀한 네트워크 시뮬레이터의 범주에서는 벗어난다. 이는 OS CPU에 내리는 명령 하나까지 에뮬레이션 하기 때문에 매우 정밀한 분석이 가능하다.

l  NetSim
NetSim은 분석 도구가 아니라 네트워크 설정을 학습하기 위한 시뮬레이션 소프트웨어이다. 사용자와 상호작용을 위해 시뮬레이션은 실시간으로 이루어진다. 전송 프로토콜, MAC 프로토콜, 라우팅 프로토콜은 물론이고 스위치, 라우터, AP 등의 장비를 시뮬레이션할 수 있다.

 

참고자료

OPNET Modeler and Ns-2: Comparing the Accuracy Of Network Simulators for Packet-Level Analysis using a Network Testbed

http://privatewww.essex.ac.uk/~fleum/weas.pdf

 

The Network Simulator - ns-2

http://www.isi.edu/nsnam/ns/

 

OPNET Technologies

http://www.opnet.com/

 

GloMoSim

http://pcl.cs.ucla.edu/projects/glomosim/

 

TOSSIM

http://docs.tinyos.net/index.php/TOSSIM

Posted by 배트
,
$defaultRNG seed 99

이 문장 하나로 간단히 시뮬레이션 전체의 랜덤 시드를 변경할 수 있다.

$defaultRNG seed 0

시드 값을 0으로 주면, 현재 시간을 시드 값으로 사용한다.
Posted by 배트
,