# README
## Compilation Procedure
* Go the directory containing the files
* Run the following command in terminal to compile the code:
* ` make `
* This will create a executable file named 'chat' in the present working directory
## Running Procedure
* Write the following command in terminal to run the application:
* ` ./chat <port number>`
* Here, port number should be one of the ports specified in users.txt
* In the users.txt file, change the port number according to your preference
* Open a new terminal window and run the above command with another available port number mentioned in users.txt
* Suppose, in one terminal window, ` ./chat 4269 ` was entered and in the other terminal window, ` ./chat 4242 ` was entered.
* Write the following text in the first terminal window:
* ` Mamata/ Hi! `
* You will see that the "Yogi Hi!" message is displayed in the second terminal window
* Similarly, you can open upto 5 terminal windows to test out the application
## Design Requirements
* The entire chat application runs under a single process.
* Every participating user maintains a user_info table that contains-
* name of the friend
* IP address of the machine where the chat application is running
* port number at which the peer-chat server is running.
* This table is static and shared a priori with all the participating users
* For the chat purpose, a user enters a message using the keyboard. The message format is as follows: `friendname/<msg>` where friendname is the name of the friend to whom the user wants to send a message, and msg is the corresponding message.
* The communication mode is asynchronous, indicating that a user can enter the message anytime. The console should always be ready to accept a new message from the keyboard, unless the user is already typing another message.
## Protocol Primitives
* As we mentioned earlier, every instance of the chat application runs a TCP server which binds itself to a well known port and keeps on listening for the incoming connections. You may assume a maximum of 5 peers (users), so a maximum of 5 connections need to be supported.
* Once the server receives a connection, it accepts the connection, reads the data from that connection, extracts the message, and displays it over the console.
* Once a user enters a message through the keyboard,
* The message is read from the stdin, the standard input file descriptor.
* The application checks whether a client socket to the corresponding server already exists. If a client socket does not exist, then a client socket is created to the corresponding server based on the lookup over user_info table
* The message is sent over the client socket
* If there is no activity over the client socket for a timeout duration, then the client socket is closed.
## Screenshot

## Flow Diagram
