Lab2
Last modified: 10/17/2022
Try
to implement the same problems as for lab 1 in the situation the server needs
to be concurrent – i.e. be able to accept multiple clients
at the same time.
Also
try to solve the following problems in the same context. What approach would be
the best in the following scenarios? (Threads, processes)
1.
The
client takes a string from the command line and sends it to the server. The
server interprets the string as a command with its parameters. It executes the
command and returns the standard output and the exit code to the client.
2.
The
client sends the complete path to a file. The server returns back the length of
the file and its content in the case the file exists. When the file does not exist the server returns a length of -1 and no content. The
client will store the content in a file with the same name as the input file
with the suffix –copy appended (ex:
for f.txt => f.txt-copy).
3.
The
server chooses a random float number <SRF>. Run multiple clients. Each
client chooses a random float number <CRF> and send it to the server.
When the server does not receive any incoming connection for at least 10
seconds it chooses the client that has guessed
the best approximation (is closest) for its own number and sends it back the
message “You have the best guess with an
error of <SRV>-<CRF>”. It also sends to each other client the
string “You lost !”.
The server closes all connections after this.
4.
The
clients send an integer number N and an array of N float values. The server
will merge sort the numbers received from all clients until it gets an empty
array of floats (N=0). The server returns to each client the size of the
merge-sorted array followed by the merge-sorted arrays of all floats from all
clients.
5.
The
client sends a domain name taken from the command line (Ex: www.google.com)
to the server. The server opens a TCP connection to the IP address
corresponding to the received domain name on port 80 (called HTTP-Srv). It sends on the TCP connection the string: “GET / HTTP/1.0\n\n” and relays the
answer back to the client. When HTTP-Srv closes connection to the server, the server closes
the connection to the client at its turn.
6.
The
server chooses a random integer number. Each client generates a random integer
number and send it to the server. The server answers with the message “larger”
if the client has sent a smaller number than the server’s choice, or with message
“smaller” if the client has send a larger number than
the server’s choice. Each client continues generating a different random number
(larger or smaller than the previous) according to the server’s indication.
When a client guesses the server choice – the server sends back to the winner
the message “You win – within x tries”. It also sends back to all other clients
the message “You lost – after y retries!” (x and y are the number of tries of
each respective client). The server closes all connections upon a win and it
chooses a different random integer for the next game (set of clients)
7.
The
client reads a username and a password from the standard input. It sends the
username to the server. The server uses the getpwent system call repeatedly
to find the password information about the username. If the entry for the
username is found, the password field from the struct passwd is returned to the client. The client recovers the
salt of the password and checks the input password with the received encrypted
version using the crypt system call.
If there is no user username, the
server returns back to the client the empty string and closes the connection.
8.
Change
the Python Example Concurrent Number Guess Bellow to transmit with each answer
to a client – the number of total clients that are competing. Also change the
client to read the numbers from the standard input and launch a contest in the
class during the lab
Example
– Concurrent Client-Server (C/C++)– Character Count
Example – Python
Concurrent Number Guess – threaded
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)