+ forum
On Thu, May 21, 2020 at 11:22 PM Himanshu Sharma <
[email protected]> 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 <[email protected]> wrote:
>
>> On Wed, May 13, 2020 at 11:30 AM Himanshu Sharma <
>> [email protected]> 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
>>> [email protected]
>>> 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
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users