UDP Recorder and UDP Replay

Alex Tweedly alex at tweedly.net
Sat May 27 13:18:31 EDT 2006

I've added a new stack to revonline - UDP Repay (under alextweedly, 
category programming)

It can be used to replay a stored log of UDP packets, such as you would 
want to do for application testing and stress testing. It simply replays 
a series of packets, keeping the original timing characteristics. 
Although it can handle multiple interleaved streams of packets to 
different ports, and can map them to new destination addresses and 
ports, it can't do anything intelligent (or indeed anything at all) to 
the streams themselves.

I will some day finish and upload the corresponding "UDP Recorder" stack 
- but the limitations on how you can insert a UDP recorder stack into a 
network context make it be of rather limited value. It's (generally) 
much easier to add recording functions to your own app, and then have it 
record a series of packets while in use.  Then you can take the 
resulting file of packets, and recreate it as a UDP stream, for testing 
while the real data source is unavailable (or simply because you want a 
repeatable set of test data).

Some sample functions that you could add to your stack are enclosed 
below; usage should be fairly obvious
 call "recorderStart pFilename"  to start recording
 call "recorderRecord pSock, pData" for every packet received (as near 
to the original receipt of the packet as possible)
 call "recorderFinish" when you're done

You can then use the UDP Replay stack to replay this file - with 
controls for
 - speed (%age of original)
 - jitter (random variation of +- 20% of inter-packet delay)
 - immediate start (often you'll set up the recorder, then have to go 
off and get everything else started, so there will be a long delay 
before the initial packet captured; this check box allows you to skip 
this initial delay on replay.

Note - it doesn't yet allow you to induce mis-ordered packets .... 
that's coming later, once I have researched current thinking about what 
kind of misordering is likely.

-- ------ functions to include in your app ------------

-- initial recode in the file
-- 1-4 length of first record *including* the length and the separating 
CR which is not part of the data recorder
-- 6-17 timestamp
-- <cr>
-- format of each record is
--   1-4 length *including* the length and the separating CR which is 
not part of the data recorder
--   6-9 socket number
--  11-22 timestamp
--   24 - (length-1)   actual data received / to be sent
--            <cr>

local lPorts, lStartTime, lPackets, lBytes, lFileName

on recorderStart pFileName
    put pFileName into lFileName
    put the milliseconds into lStartTime
    open file lFileName for binary write
    write format("%4d %12d", 18, lStartTime) & cr to file lFileName
    put 0 into lPackets
    put 0 into lBytes
end recorderStart

on recorderRecord pSock, pData
    put format("%12d", milliseconds() - lStartTime) into tMsec
    put 4 + 1 + 4 + 1 + 12 + 1 + len(pData)+1 into tLen
    write  format("%4d %4d %12d", tLen, pSock, tMsec) && pData &CR to 
file lFileName
    add 1 to lPackets
    add len(pData) to lBytes
end recorderRecord

function recorderStatus
    return the milliseconds - lStartTime, lPackets, lBytes
end recorderStatus

function recorderFinish
    close file lFileName
    return the milliseconds - lStartTime, lPackets, lBytes
end recorderFinish

Alex Tweedly       http://www.tweedly.net

No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.394 / Virus Database: 268.7.2/349 - Release Date: 26/05/2006

More information about the Use-livecode mailing list