[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Feature request: UDP generic protocol testing
From: |
Jan-Henrik Haukeland |
Subject: |
Re: Feature request: UDP generic protocol testing |
Date: |
Sat, 29 Oct 2005 01:58:43 +0200 |
On 22. okt. 2005, at 03.43, Alex Black wrote:
There are a number of things I'd like to test for using Monit that
answer on UDP, for example SIP and IAX (voip protocols). Could
functionality be added so send/expect can be used with UDP sockets
as well as TCP stream sockets?
I have studied this and have one question. Are you sure that send/
expect does not work over UDP?
The reason I ask is that send/expect should in principle work with
UDP sockets. I thought it would not, but after reading up on Stevens
(again) there is nothing in monits code that prevent send/expect to
work with UDP. I have even written a simple echo-server to test UDP
with monit and it works perfectly (admittedly it is a simple test).
Technical discussion:
1) We call connect on all sockets, also UDP sockets. This allow us to
use write/read on UDP as well as TCP sockets. I.e. make i/o
operations transparent which we use in the socket.c and net.c code.
2) We do not have logic to a) resend lost UDP packets nor b) sequence
number testing to assembly packets in order when we read. These
shortcomings makes send/expect over UDP unreliable.
3) Adding reliability to UDP sockets require support for both a) and
b). This means quite a bit of recoding and redesign in monit's net.c
and socket.c code. It's possible of course and if anyone would like
to provide a patch it would be very welcome. I really need to use
most of my free time now on m/monit.
4) However if you follow these recommendations then testing an UDP
server may work.
- Use a send then expect pattern. That is, for each send call expect.
- Make sure that you do not send or that the server send more text
than can be
put into an IP packet. The Ethernet Frame max out at around 1500
bytes. In case
of problems, limit the test to only one send/expect pair and send
max a few
hundred bytes and hope the server does the same.
- Since packets may be lost, use the new fail tolerant mode in
monit version
4.6 to allow some failure before raising an error. For example,
check host foo with address foo.baz
if failed port 9877 type udp
send "Hello World!\r\n"
expect "Hello World*"
send "Hello Norway\r\n"
expect "Hello*"
for 5 times within 8 cycles # Fail tolerant
then alert
Does this work?
--
Jan-Henrik Haukeland
Mobil +47 97141255