SNMPRemoteAgent::SNMPRemoteAgent(std::string name, std::string community, unsigned int port, SNMPSession * pSession) {
	_name = name;
	_port = port;
	_community = community;
	_bInit = false;
	_mySession = false;
	_pSession = pSession;
	_hEntity = SNMPAPI_FAILURE;
	_hContext = SNMPAPI_FAILURE;
	if(_pSession == NULL) {
		try {
			_pSession = new SNMPSession();
		} catch(SNMPException * pe) {
			SNMP_RETHROW_ERROR("Could not create WinSNMP session", pe, SNMPAPI_OTHER_ERROR, SNMP_ERROR);
		}
		_mySession = true;
	}
	HSNMP_SESSION hSession = _pSession->getHandle();
	if(hSession == SNMPAPI_FAILURE) {
		if(_mySession && _pSession != NULL) {
			delete _pSession;
		}
		_pSession = NULL;		
		SNMP_THROW_ERROR("Invalid session", SnmpGetLastError(NULL), SNMP_ERROR);
	}
	_hEntity = SnmpStrToEntity(hSession, _name.c_str());
	if (_hEntity == SNMPAPI_FAILURE) {
		LPHOSTENT lpHostent = gethostbyname(_name.c_str());
		IN_ADDR host;
		if(!lpHostent) {
			if(_mySession && _pSession != NULL) {
				delete _pSession;
			}
			_pSession = NULL;
			SNMP_THROW_ERROR("Could not get host by name", SNMPAPI_OTHER_ERROR, SNMP_ERROR);
		}
		memmove (&host, lpHostent->h_addr, sizeof(IN_ADDR));
		_hEntity = SnmpStrToEntity(hSession, inet_ntoa(host));
		if (_hEntity == SNMPAPI_FAILURE) {
			if(_mySession && _pSession != NULL) {
				delete _pSession;
			}
			_pSession = NULL;
			SNMP_THROW_ERROR("Could not convert remote agent address to entity", SnmpGetLastError(hSession), SNMP_ERROR);
		}
	}
	if(port != 0) {
		if(SnmpSetPort(_hEntity, port) != SNMPAPI_SUCCESS) {
			SnmpFreeEntity(_hEntity);
			_hEntity = SNMPAPI_FAILURE;
			if(_mySession && _pSession != NULL) {
				delete _pSession;
			}
			_pSession = NULL;
			SNMP_THROW_ERROR("Could not set remote agent port", SnmpGetLastError(hSession), SNMP_ERROR);
		}
	}
	smiOCTETS dCtx;
	dCtx.len = (smiUINT32)strlen(community.c_str());
	dCtx.ptr = (smiLPBYTE)community.c_str();
	_hContext = SnmpStrToContext(hSession, &dCtx);
	if (_hContext == SNMPAPI_FAILURE)  {
		SnmpFreeEntity(_hEntity);
		_hEntity = SNMPAPI_FAILURE;
		if(_mySession && _pSession != NULL) {
			delete _pSession;
		}
		_pSession = NULL;
		SNMP_THROW_ERROR("Could not convert community name to context", SnmpGetLastError(hSession), SNMP_ERROR);
	}
	_pSession->registerRemoteAgent(this);
	_bInit = true;
}
int _tmain(int argc, _TCHAR* argv[])
{

    unsigned long majorVal = 1;
    unsigned long *major = &majorVal;
    unsigned long minorVal = 1;
    unsigned long *minor = &minorVal;
    unsigned long levelVal = 1;
    unsigned long *level = &levelVal;
    unsigned long translateModeVal = 1;
    unsigned long *translateMode = &translateModeVal;
    unsigned long retransmitModeVal = 1;
    unsigned long *retransmitMode = &retransmitModeVal;
    SnmpStartup(major, minor, level, translateMode, retransmitMode);
    HWND hsession;
    HSNMP_ENTITY entDest;
    char destIP[] = "192.168.1.1";
    HSNMP_ENTITY entSrc;
    char srcIP[] = "192.168.1.2";
    HSNMP_CONTEXT hContext;
    char Ctx[]="public";
    SNMPAPI_STATUS status = 0;
    LPCSTR string = "entityName";
    UINT msg;
    LPHSNMP_PDU PDU = 0;
    LPHSNMP_VBL varbind_lst;
    LPHSNMP_CONTEXT context;
    smiLPINT PDU_typ, r_id, error_stat, error_index;
    smiOCTETS dContext;
    smiOID dName;
    smiVALUE dValue;
    SNMP_worker worker;

    HSNMP_SESSION session = SnmpCreateSession(NULL, 0, &SNcallback, (void*)&worker);

    entDest = SnmpStrToEntity(session, destIP);
    entSrc  = SnmpStrToEntity(session, srcIP);
    dContext.ptr=(smiLPBYTE)Ctx;
    dContext.len=strlen(Ctx);
    hContext= SnmpStrToContext(session,&dContext);
    printf("entity return: %i\n", entDest);
    status = SnmpListen(entDest, status);
    printf("listen return: %i\n", status);
    while (status = SnmpRecvMsg(session, &entSrc, &entDest, context, PDU) ) {
        printf("recv return: %i\n", status);
        printf("PDU: %s\n", PDU);
    };
    SnmpGetPduData(PDU, PDU_typ, r_id, error_stat, error_index, varbind_lst);
    printf("%lu, %lu\n", *major, *minor);
    printf("%p, %p\n", (void *)major, (void *)minor);
    /*
    char *ip = "192.168.1.174";
    char *community = "public";
    LPSNMP_MGR_SESSION ptr;
    ptr = SnmpMgrOpen(ip, community, 10000, 3);
    SnmpRecvMsg(
    SnmpMgrClose(ptr);
    */

    SnmpCleanup();
    return 0;
}