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

📄 agentapi.cxx

📁 RTP协议
💻 CXX
字号:
/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */static const char* const AgentApi_cxx_Version =    "$Id: AgentApi.cxx,v 1.42 2002/12/04 21:49:01 sprajpat Exp $";#include "global.h"#include <unistd.h>#include <sys/param.h>#include <netinet/in.h>#include "AgentApi.hxx"#include "UdpStack.hxx"#include "cpLog.h"#include "NetworkConfig.hxx"AgentApi::AgentApi(ServerType serType /*Default Argument*/, string appName /*Default Argument*/ ) : ThreadIf(){    char hostname[MAXHOSTNAMELEN];    myServerType = serType;    myApplName = appName;    memset(hostname, 0, sizeof(hostname));    NetworkAddress na;    agentIpStr = na.getIpName().c_str();}///AgentApi::~AgentApi(){    // close ports, deallocate memory    cpLog( LOG_DEBUG, "entered agentApi destructor");    shutdown();    join();}/** * send a trap message to the trap agentTrapPort on the local machine * @param trapType enum representing trap type defined in mib * @param parameter text string to include in message * @return voReturnStatus */voReturnStatusAgentApi::sendTrap(int trapType, string parameter){    try    {        NetworkAddress dest(agentIpStr, agentTrapPort);        memset(&trapMessage, 0, sizeof(trapMessage));        trapMessage.action = (actionT)Trap;        trapMessage.mibVariable = (AgentApiMibVarT)trapType;        if (parameter.length() < PARM1SIZE )        {            strcpy(trapMessage.parm1, parameter.c_str());        }        else        {            return voFailure;        }        udpStack->transmitTo((char *)&trapMessage, sizeof(trapMessage), &dest);        return voSuccess;    }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif    {        return voFailure;    }}/** * send an integer reaponse to another agentapi  * @param val integer value * @param sender destination of message */voReturnStatusAgentApi::sendResponse(int val, NetworkAddress *sender){    try    {        message.action = (actionT)Response;	memset(message.parm2, 0, sizeof(message.parm2));	memcpy(message.parm2, &val,  sizeof(val));	if (sender) 	    cpLog( LOG_DEBUG, "send integer response: %d to %s:%d",		   val, sender->getHostName().c_str(), sender->getPort());        udpStack->transmitTo((char *)&message, sizeof(message), sender);        return voSuccess;    }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif    {        return voFailure;    }    return voSuccess;}/** * send a ulong reaponse to another agentapi  * @param val ulong value * @param sender destination of message */voReturnStatusAgentApi::sendResponse(unsigned long val, NetworkAddress *sender){    try    {        message.action = (actionT)Response;	memset(message.parm2, 0, sizeof(message.parm2));	memcpy(message.parm2, &val, sizeof(val));        cpLog( LOG_DEBUG, "send ulong response: %d to %s:%d",               val, sender->getHostName().c_str(), sender->getPort());        udpStack->transmitTo((char *)&message, sizeof(message), sender);        return voSuccess;    }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif    {        return voFailure;    }    return voSuccess;}/** * send a string reaponse to another agentapi  * @param parameter string value * @param sender destination of message */voReturnStatusAgentApi::sendResponse(string parameter, NetworkAddress *sender){    try    {        message.action = (actionT)Response;        if (parameter.length() < PARM2SIZE )        {            strcpy(message.parm2, parameter.c_str());        }        else        {            return voFailure;        }        cpLog( LOG_DEBUG, "send string response: %s to %s:%d",               parameter.c_str(), sender->getHostName().c_str(), sender->getPort());        udpStack->transmitTo((char *)&message, sizeof(message), sender);        return voSuccess;    }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif    {        return voFailure;    }}/** * send a reaponse to another agentapi  * @param inData data to send in parameter.  must be smaller than PARM2SIZE * @param sender destination of message */voReturnStatusAgentApi::sendResponse(void *inData, NetworkAddress *sender){    try    {        message.action = (actionT)Response;	memset(message.parm2, 0, sizeof(message.parm2));        memcpy(message.parm2, inData, sizeof(message.parm2));        cpLog( LOG_DEBUG, "send generic response to %s:%d",               sender->getHostName().c_str(), sender->getPort());        udpStack->transmitTo((char *)&message, sizeof(message), sender);        return voSuccess;    }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif    {        return voFailure;    }}voReturnStatussendRequest(string indexName, ServerType serType){    cpLog( LOG_ERR, "Using function not yet implemented 2" );    return voFailure;}voReturnStatussendRequest(string indexName, int setValue){    cpLog( LOG_ERR, "Using function not yet implemented 2" );    return voFailure;}/** * first it registers on ports based on the type of agent it is, then  * infinate loop that waits for messages from other agentApi's and processes them. */voidAgentApi::thread(){    int bytesRead = 0;    NetworkAddress sender;    NetworkAddress dest;    if((NetworkConfig::instance().isDualStack()) ||       (NetworkConfig::instance().getAddrFamily() == PF_INET))    {        dest.setHostName(registerMulticastIP);        dest.setPort(registerMulticastPort );    }    else    {        dest.setHostName("ff14::1");        dest.setPort(registerMulticastPort );    }    memset(&message1, 0, sizeof(message1));    myLock.lock();    switch (myServerType)    {        case SERVER_Agent:        // register to receive the messages on the well known agent port        // then send out the multicast message.#ifdef __linux__	    udpStack = new UdpStack(0, agentTrapPort, agentTrapPort, sendrecv, false);#else	    udpStack = new UdpStack(0, -1 , -1 , sendrecv, false);#endif		    message1.action = (actionT)Register_Req;	    udpStack->transmitTo((char *)&message1, sizeof(message1), &dest);	    break;        case SERVER_NetMgnt:	    udpStack = new UdpStack(0, MANAGERTRAPPORT , MANAGERTRAPPORT, sendrecv, false);	    break;        default :	    udpStack = new UdpStack(0, -1 , -1 , sendrecv, false);	    memset(&message, 0, sizeof(message));	    message1.action = (actionT)Register;	    int *pi = (int *)message1.parm1;	    int tmpPort = udpStack->getRxPort();	    memcpy(&pi[0], &myServerType, sizeof(int));	    memcpy(&pi[1], &tmpPort, sizeof(int));	    if (sizeof(message1.parm2) < myApplName.length()) 	    {		memcpy(message1.parm2, (char*)myApplName.c_str(), 		       sizeof(message1.parm2));	    } 	    else 	    {		memcpy(message1.parm2, (char*)myApplName.c_str(), 		       myApplName.length());	    }	    agentRegister = new AgentRegister((void *) & message1, 					      sizeof(message1));	    agentRegister->run();	    break;    }    myLock.unlock();    while (true)    {        try        {            // Poll every second             memset((void *)&message, 0, sizeof(ipcMessage));            bytesRead = udpStack->receiveTimeout((char *) & message, 						 sizeof(ipcMessage), 						 &sender, 						 0, 100);            if ( bytesRead )            {                cpLog( LOG_DEBUG, "bytes read=%d", bytesRead);                processMessage(&message, &sender);            }        }#ifdef PtW32CatchAll    PtW32CatchAll#else    catch ( ... ) #endif        {            cpLog( LOG_ERR, "Exception from udpstack for AgentApiRx" );        }        if ( isShutdown() == true )        {            return ;        }    }}

⌨️ 快捷键说明

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