Lab3
Last modified: 3/10/2024 19:47
Use
UDP to implement the problems from Lab1 and Lab2 and the following problems. Think of a way to write
concurrent UDP servers. Use examples bellow as guidance.
Example SELECT– Multiplexed TCP Client-Server Chat application
Note: Run the server and
the client on different hosts. For this you need to know the IP address of the
machine where the server runs (ifconfig/ipconfig)
Note: Learn
to use Wireshark in
order to inspect network traffic.
1.
The
client sends periodical PING datagrams with a random content to a
<server> and <port> specified in command line. The server returns
back (echoes) the same packets (content). The client checks the content of the
received packets to match what was sent and computes the round trip time and
displays it to the user – for each sent packet.
2.
Implement
the Python
concurrent example from lab2 to work with UDP. You no longer need threads
to be able to serve multiple clients – so the implementation should be much
shorter.
3.
Implement
a UDP-based real-time collaborative whiteboard application where multiple
clients can draw on a shared canvas. The server manages the canvas state and
broadcasts updates to all clients. Use drawing primitives of type line, circle,
ellipse, rectangles with contour colors and eventually fill.
4.
Implement
the Chat server example (see the link bellow) using UDP and TCP –only this time
each client should contact the server just for registration. All communication
happens directly between the peers (clients) without passing trough the server. Each client maintains an endpoint
(TCP/UDP) with the server just for learning the arrival/departure of other
clients. You create a mesh architecture where all clients connect directly
between each others.
5. Write an UDP broadcast application that serves as client and server at the same time. The application is started with the network broadcast address (<NBCAST>) as argument in the command line.
1. Upon launching the
application listens on UDP port 7777.
2.
Every
3 seconds the application sends a UDP broadcast message to NBCAST port 7777
with the format: TIMEQUERY\0 (string)
3.
Whenever
the application receives a TIMEQUERY demand it answers to the source IP:port with a string message: TIME HH:MM:SS\0 (current
time) using unicast.
4.
Every
10 seconds the application sends a UDP broadcast message to NBCAST port 7777
with the format: DATEQUERY\0 (string)
5.
Whenever
the application receives a DATEQUERY demand it answers to the source IP:port with a string message: DATE DD:MM:YYYY\0 (current
date) using unicast.
6.
The
application will keep a list of peers (that answer to broadcast – IP:portno) and update the information anytime a unicast
message is received upon a broadcast.
7.
When
an entry in a list does not have any answer for 3 consecutive broadcasts it
will be removed from the list.
8.
The
list will be displayed (ip,date, time) on the screen
upon each update (using a screen positioning api like
conio or by erasing the screen before each update).
9.
Every
malformed request/response received will be counted and displayed at the end of
a screen update. You will have a list of malformed messages displayed with
their source IP address. The list should be limited in size and implemented as
a queue. Recent messages are added to the head and old messages are moving
towards the tail.
Note: Suggestion:
Implement the application on Windows, or run it on your laptop in order to be
able (all of you simultaneously) to listen on port 7777. Your application
should strictly follow the protocol and be able to interact with all
applications written by your colleagues.
Note: On
Windows in order to have timer like events (periodical events handled) use timeSetEvent or
a similar function (the newer CreateTimerQueueTimer) and set
a different callback function for each type of event.
Note: Sending
broadcast UDP requires a setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast)
as in example.
Receiving broadcast usually doesn’t require
any additional effort compared to a normal UDP application. If not able to
receive broadcast on windows try to setsockopt on the receiving socket as well.
Note
(Malformed traffic): To generate malformed traffic one could use the nc (network cat)
command on a linux like system as it follows:
nc -4 –u
<dstip> <dstport>
and
type in anything until CTRD+D is pressed ! Anything typed in will be sent to
the the remote IP and port using the specified
protocol (u=udp)
or
<command>
| nc -4 –u 172.30.5.16 7777
Example
of displayed results:
172.30.0.4:7777 TIME
16:51:43 DATE 08:04:2014
172.30.118.185:7777 TIME 16:51:47 DATE 08:04:2014
172.30.116.220:7777 TIME 16:51:44 DATE 08:04:2014
172.30.112.50:7777 TIME 16:51:42 DATE 08:04:2014
Malformed
Data:
172.30.118.185:7777
- HELLO
172.30.118.185:7777
- HELLO
172.30.118.185:7777
- HELLO
172.30.118.185:7777
- HELLO
172.30.118.185:7777
- HELLO
172.30.116.220:7777
- asdasdDATE 08:04:201
172.30.116.220:7777
- asdasdTIME 16:30:50
172.30.116.220:7777
- asdasdTIME 16:30:52
172.30.116.220:7777
- asdasdTIME 16:30:56
172.30.116.220:7777
- asdasdTIME 16:30:59