[Winpcap-users] Efficient sending huge number of UDP packets	at	a fixed specified rate
    Gianluca Varenni 
    Gianluca.Varenni at riverbed.com
       
    Mon Apr 11 17:21:15 PDT 2011
    
    
  
You cannot have a microseconds wait on windows (or linux). The only way to get sub-milliseconds delay is to use a busy wait loop and check the high performance counter with QueryPerformanceCounter/QueryPerformanceFrequency.
Have a nice day
GV
-----Original Message-----
From: winpcap-users-bounces at winpcap.org [mailto:winpcap-users-bounces at winpcap.org] On Behalf Of "Fish" (David B. Trout)
Sent: Saturday, April 09, 2011 3:34 PM
To: winpcap-users at winpcap.org
Subject: Re: [Winpcap-users] Efficient sending huge number of UDP packets at a fixed specified rate
Metcherin Sergey wrote:
> Fish wrote:
> > Metcherin Sergey wrote:
> > 
> > > Do you know efficient way of sending UDP packets at a fixed rate 
> > > efficiently?
> > > [...]
> > > Can you give any recommendations?
[...]
> > If you don't need to delay for less than a millisecond between 
> > packets (or groups of packets) you might consider using NPG (Network 
> > Packet Generator):
> 
> Thank you for the link, unfortunately I need high time resolution
> - several microseconds.
It's open source.
Just change the millisecond Sleep()'s to function calls that delay for a specified number of microseconds instead:
int usleep( useconds_t usecs )
{
  struct timespec rqtp;
  if (usecs < 0 || usecs >= 1000000)
  {
    errno = EINVAL;
    return -1;
  }
  rqtp.tv_sec  = 0;
  rqtp.tv_nsec = usecs * 1000;
  return nanosleep( &rqtp );
}
int nanosleep( const struct timespec* rqtp ) {
  static BOOL    bDidInit   = FALSE;
  static HANDLE  hTimer     = NULL;
  LARGE_INTEGER  liDueTime;
  // Create the waitable timer if needed...
  if (!bDidInit)
  {
    bDidInit = TRUE;
    VERIFY((hTimer = CreateWaitableTimer( NULL, TRUE, NULL )) != NULL);
  }
  // Check passed parameters...
  if (!rqtp || rqtp->tv_nsec < 0 ||
    rqtp->tv_nsec >= 1000000000)
  {
    errno = EINVAL;
    return -1;
  }
  // SetWaitableTimer argument is #of 100-nanosecond intervals.
  // Positive values indicate absolute UTC time. Negative values
  // indicate relative time. The actual timer accuracy depends
  // on the capability of your hardware.
  liDueTime.QuadPart =  -      // (negative means relative)
  (
      (((__int64)rqtp->tv_sec * 10000000))
      +
      (((__int64)rqtp->tv_nsec + 99) / 100)
  );
  // Set the waitable timer...
  VERIFY( SetWaitableTimer( hTimer, &liDueTime, 0, NULL, NULL, FALSE ));
  // Wait for the waitable timer to expire...
  VERIFY( WaitForSingleObject( hTimer, INFINITE ) == WAIT_OBJECT_0 ;
  return 0;
}
--
"Fish" (David B. Trout)
 fish at softdevlabs.com
_______________________________________________
Winpcap-users mailing list
Winpcap-users at winpcap.org
https://www.winpcap.org/mailman/listinfo/winpcap-users
    
    
More information about the Winpcap-users
mailing list