⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpctrl.cpp

📁 windows的snmp api源码
💻 CPP
字号:
#include <stdafx.h>
#include "Errors.h"
#include "SNMPCtrl.h"
#include "EventCmd.h"

CSNMPController gSNMPController;

CSNMPController::CSNMPController()
{
    m_hSNMPService = NULL;
    m_hServiceController = NULL;
}

CSNMPController::~CSNMPController()
{
    if (m_hSNMPService != NULL)
        CloseServiceHandle(m_hSNMPService);
    if (m_hServiceController != NULL)
        CloseServiceHandle(m_hServiceController);
}

DWORD CSNMPController::LoadSvcHandle()
{
    if (m_hSNMPService == NULL)
    {
        if (m_hServiceController == NULL)
        {
            m_hServiceController = OpenSCManager(
                gCommandLine.m_szSystem,
		        "ServicesActive",
		        GENERIC_EXECUTE);

            if (m_hServiceController == NULL)
                return _E(GetLastError(), IDS_ERR25);
        }
	
	    m_hSNMPService = OpenService(
            m_hServiceController,
            "SNMP",
            SERVICE_CONTROL_INTERROGATE | SERVICE_START | SERVICE_STOP);

        if (m_hSNMPService == NULL)
            return _E(GetLastError(), IDS_ERR26);
    }
    return ERROR_SUCCESS;
}

BOOL CSNMPController::IsSNMPRunning()
{
    SERVICE_STATUS snmpStatus;

    if (LoadSvcHandle() != ERROR_SUCCESS)
        return FALSE;

    if (!QueryServiceStatus(m_hSNMPService, &snmpStatus))
        return _E(GetLastError(), IDS_ERR27);

    _W(WARN_TRACK, IDS_TRCK_WRN49, snmpStatus.dwCurrentState);

    return snmpStatus.dwCurrentState == SERVICE_RUNNING;
}

DWORD CSNMPController::StartSNMP()
{
    DWORD           retCode;
    SERVICE_STATUS  svcStatus;
    DWORD           dwRetries;

    if ((retCode = LoadSvcHandle()) != ERROR_SUCCESS)
        return retCode;

    if (!StartService(m_hSNMPService, 0, NULL))
        return _E(GetLastError(), IDS_ERR28);

    for (dwRetries = 10; dwRetries > 0; dwRetries--)
    {
        printf("."); fflush(stdout);
        if (!QueryServiceStatus(m_hSNMPService, &svcStatus))
            return _E(GetLastError(), IDS_ERR29);
        if (svcStatus.dwCurrentState == SERVICE_RUNNING)
            break;
        if (svcStatus.dwCurrentState == SERVICE_START_PENDING)
        {
            if (svcStatus.dwWaitHint < 200)
                svcStatus.dwWaitHint = 200;
            if (svcStatus.dwWaitHint > 1000)
                svcStatus.dwWaitHint = 1000;
            Sleep(svcStatus.dwWaitHint);
        }
        else
            return _E(ERROR_INVALID_STATE, IDS_ERR06, svcStatus.dwWaitHint);
    }
    printf("\n");

    return retCode;
}

DWORD CSNMPController::StopSNMP()
{
    DWORD           retCode;
    SERVICE_STATUS  svcStatus;
    DWORD           dwRetries;

    if ((retCode = LoadSvcHandle()) != ERROR_SUCCESS)
        return retCode;

    if (!ControlService(m_hSNMPService, SERVICE_CONTROL_STOP, &svcStatus))
    {
        retCode = GetLastError();
        if (retCode == ERROR_SERVICE_NOT_ACTIVE)
        {
            _W(WARN_TRACK, IDS_TRCK_WRN50);
            return ERROR_SUCCESS;
        }
        return _E(GetLastError(), IDS_ERR30);
    }

    for (dwRetries = 10; dwRetries > 0; dwRetries--)
    {
        printf("."); fflush(stdout);
        if (!QueryServiceStatus(m_hSNMPService, &svcStatus))
            return _E(GetLastError(), IDS_ERR31);
        if (svcStatus.dwCurrentState == SERVICE_STOPPED)
            break;
        if (svcStatus.dwCurrentState == SERVICE_STOP_PENDING)
        {
            if (svcStatus.dwWaitHint < 200)
                svcStatus.dwWaitHint = 200;
            if (svcStatus.dwWaitHint > 1000)
                svcStatus.dwWaitHint = 1000;
            Sleep(svcStatus.dwWaitHint);
        }
        else
            return _E(ERROR_INVALID_STATE, IDS_ERR06, svcStatus.dwWaitHint);
    }
    printf("\n");

    if (dwRetries == 0)
        return _E(ERROR_TIMEOUT, IDS_ERR07);

    return retCode;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -