On Wed, May 13, 2020 at 11:30 AM Himanshu Sharma <
himanshusharma1...@gmail.com> wrote:

> Hi All,
>
> Recently, I have changed  *agent_check_and_process(1),*
> In the SNMP Subagent code to a *select() & snmp_select_info() to handle
> outside events*
> *, Please find the code snippet attached.*
>
> I have tried to make *fakeblock=0 *too.
>
> Problem I am facing is , If Subagent Process comes up in the system before
> the Master Agent(*snmpd*) Process.* Subgent is not able to establish
> connection with Master Agent*.But if Master Agent(snmpd) process comes up
> before the Subagent process in the system, The connection between master
> Agent and Subagent is *successful.*
>
> Moreover once the connection is established  between Master Agent and
> SubAgent, If I restart snmpd(Master Agent ) it doesn't connect back to the
> Subagent.
>
> Above problem is solved if I use agent_check_process(1) .i.e.The Subagent
> keeps on polling until it establishes connection with the master agent.( *This
> is default expected behaviour*).
>
> Looks like there is some problem in usage of select() and
> snmp_select_info()
> I am using net-snmp 5.8.
>
> Please help me on this 😞.
>
> *-Himanshu*
>
> /////code start from here
> keepRunning_=1;
>     int maxFd;
>     fd_set fdset;
>     struct timeval  timeout = { LONG_MAX, 0 }, *tvp = &timeout;
>     int  result;
>     int  fakeblock = 0;
>     maxFd = 0;
>
>     while (keepRunning_)
>     {
>         /* if you use select(), see snmp_select_info() in snmp_api(3) */
>         /*     --- OR ---  */
>        * //agent_check_and_process(1)*; /* 0 == don't block */
>         maxFd = *eventPipe_;
>         FD_ZERO(&fdset);
>         snmp_select_info(&maxFd, &fdset, tvp, &fakeblock);
>         FD_SET(*eventPipe_, &fdset);
>         maxFd = (std::max(maxFd, *eventPipe_));
>
>         result = select(maxFd+1, &fdset, NULL, NULL, NULL);
>

The final argument to select() is how long to wait before you time out.
You are passing NULL, instead of tvp, so there is no hope that you will
reach the timeout that the agent sets to reconnect itself.


>
>         if (result == -1)
>         {
>             if (errno != EINTR)
>             {
>                 snmp_log_perror("select");
>             }
>             continue;
>         }
>         else if (result == 0)
>         {
>             snmp_timeout();
>

When you're an agent you also have to call run_alarms().

  Bill

            continue;
>         }
>        else {
>        if (FD_ISSET(*eventPipe_, &fdset))
>             {
>               //do something
>             }
>         if (result > 0)
>         {
>                 /*
>                 * packets found, process them
>                 */
>                 snmp_read(&fdset);
>         }
>         else
>         {
>                 printf("runSubAgent select returned result %d",result);
>         }
>
> }
>     }
> _______________________________________________
> Net-snmp-users mailing list
> Net-snmp-users@lists.sourceforge.net
> Please see the following page to unsubscribe or change other options:
> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
>
_______________________________________________
Net-snmp-users mailing list
Net-snmp-users@lists.sourceforge.net
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users

Reply via email to