+ forum On Thu, May 21, 2020 at 11:22 PM Himanshu Sharma < himanshusharma1...@gmail.com> wrote:
> Hi Bill, > > Thanks for the response. > I am now able to reconnect to the Master Agent(snmpd) after adding > run_alarms(). > and passing tvp as an argument to select() function as have mentioned. > I have made tvp as 5 second but the moment it tvp is passed to > snmp_select_info() as a argument it becomes zero. > What happens now is select get's timed out immediately, even though it is > configured to timeout for 5 seconds. > I have tried making *fakeblock =0 as well as 1*. > > Here is the code snippet > > > Regards > -Himanshu > > > > > > *struct timeval tvp; tvp.tv_sec = 5; tvp.tv_usec = 0;* 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_)); > *printf("select value of tv_sec %d error, tv_usec = > %d\n",(int32_t)tvp.tv_sec,(int32_t)tvp.tv_usec);* > > result = select(maxFd+1, &fdset, NULL, NULL, &tvp); > > if (result == -1) > { > printf("select returned error, errno = %d", errno); > if (errno != EINTR) > { > snmp_log_perror("select"); > } > continue; > } > else if (result == 0) > { > printf("select timeout, errno = %d", errno); > snmp_timeout(); > *run_alarms();* > continue; > } > else > { > printf("do other processing"); > } > > } > > On Mon, May 18, 2020 at 4:08 AM Bill Fenner <fen...@gmail.com> wrote: > >> 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