Re: snmp_select_info() timeout behaviour
Joe Stringer <[email protected]>
| Newsgroups | gmane.network.net-snmp.user |
|---|---|
| Message-ID | <CAPmMjUnHrPQ4D5mrEx9z7-KizeUO2=UF8-sJ7q=JcjP9RK4w+g@mail.gmail.com> |
Correction, it seems that this behaviour is actually happening even if I set the timeout >= 15secs. However, it is after 15sec that snmp_select_info starts this behaviour. On Thu, Jan 19, 2012 at 2:49 PM, Joe Stringer <[email protected]> wrote: > Greetings, > > I've been writing a subagent against net-snmp 5.7.1 under a 64-bit > ubuntu linux install, based on the example subagent code > (http://www.net-snmp.org/tutorial/tutorial-5/toolkit/demon/example-demon.c), > using the snmp_select_info() API. In addition to handling snmp > communication with the master, it is sending messages to a nox > application on a regular interval, and dealing with responses from > that socket. > > It seems that if select() times out after <15secs, then I call > snmp_select_info(), it will try to set the timeout so that it will > expire 15sec after the original call. All subsequent calls to > snmp_select_info() set the timeout to 1usec. > > Example: if poll_interval_ = 14sec, > - socket() times out after 14s, and a message is sent. I reset the > timer to 14sec. > - when snmp_select_info() is next passed the timer object, it resets > the timer to ~1sec. > - After this timeout, I reset the timer to 14sec, then > snmp_select_info() changes the timeout to {0,1}. > - Repeat the last step ad infinitum! > > Why does net-snmp do this? It seems to be fine if I set poll_interval_ >=15sec. > > Am I missing some API calls that I should be making? > > Below is the main loop of the code I'm using, followed by the output I > see. The code beforehand is mostly the same as the example, with a > couple of extra variable declarations, socket setup, sending an > initial msg to noxfd. > > -- CODE -- > /* Set up our timers */ > struct timeval expire_time,timer; > timerclear(&timer); > timerclear(&expire_time); > timer.tv_sec = poll_interval_; > > size_t len = 0; > while(keep_running_) { > FD_ZERO(&fdset); > FD_SET(noxfd, &fdset); > > fprintf(stderr, "Timer check %d:%d\n", timer.tv_sec, timer.tv_usec); > > gettimeofday(&expire_time, NULL); > expire_time.tv_sec += poll_interval_; > > snmp_select_info(&numfds, &fdset, &timer, &block); > > fprintf(stderr, "Timer check1 %d:%d\n", timer.tv_sec, timer.tv_usec); > > count = select(numfds, &fdset, NULL, NULL, &timer); > > if (count == 0) { > /* Regular stats request sending */ > if (send(noxfd,stats_msg, strlen(stats_msg), 0) != 0) > snmp_log(LOG_ERR, "Failed to send stats_request"); > > snmp_timeout(); > timer.tv_sec = poll_interval_; > timer.tv_usec = 0; > fprintf(stderr, "Timer reset %d:%d\n", timer.tv_sec, timer.tv_usec); > } else if (count > 0) { > /* Either nox or netsnmp has an event to deal with */ > if(FD_ISSET(noxfd, &fdset)) { > if ((len = read(noxfd, buf, 2048)) > 0) { > parse_response(buf, len); > } > > /* Make sure snmp_read() doesn't tinker with our noxfd */ > FD_CLR(noxfd, &fdset); > --count; > } > if (count > 0) /* If there are SNMP events */ > snmp_read(&fdset); > > struct timeval current; > gettimeofday(¤t, NULL); > timersub(&expire_time, ¤t, &timer); > > fprintf(stderr, "Timer check2: %d:%d\n", timer.tv_sec, timer.tv_usec); > } > } > > -- OUTPUT -- > Timer check 14:0 > Timer check1 14:0 > Parsing response... > Timer check2: 13:998949 > Timer check 13:998949 > Timer check1 13:998949 > Timer reset 14:0 > Timer check 14:0 > Timer check1 0:985627 > Timer reset 14:0 > Timer check 14:0 > Timer check1 0:1 > Timer reset 14:0 > Timer check 14:0 > Timer check1 0:1 > Timer reset 14:0 > Timer check 14:0 > Timer check1 0:1 > Timer reset 14:0 > Timer check 14:0 > ... > > Any help would be appreciated. > > Cheers, > Joe ------------------------------------------------------------------------------ Keep Your Developer Skills Current with LearnDevNow! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-d2d _______________________________________________ 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