Starting from:
$30

$24

Hmk #4

Problem #1 TCP Sockets

Server-70 points

Write a console program that takes as a command line argument the port number on which the TCP Server will listen for connection requests. A separate thread shall be created to handle the data received from each remote client and the remote clients can continue to send and receive data on the connections until either the server or the client closes the connection. The TCP server needs to maintain a list of all connected clients so that it can send out the appropriate messages. The TCP server needs to be able to receive data from clients without blocking the main application thread. The program needs to respond to user input while handling socket communications at the same time.

    1) The program should continuously prompt the user for commands to execute like so: Please enter command: 0 - prints to the console the last message received (if any) Last Message: last message received

Please enter command: 1 - prints to the console a list of all connected clients (ip address and port number) like the following:

Numer of Clients: 2

IP Address
Port
localhost
51717
localhost
51718

Please enter command: q - closes all sockets and terminates the program 2) The data being sent back and forth will use the following packet structure:
struct tcpMessage
{

unsigned char nVersion;
unsigned char nType;

unsigned short nMsgLen;
char chMsg[1000];
};


The TCP server needs to have the following functionality for received messages:

    • If nVersion is not equal to 1 then the message is ignored.

    • If nType == 0 then the message should be sent to all other connected clients exactly as received (but not the client that sent the message).

    • If nType == 1 then the message is reversed and sent back to only the client that sent the message.

Client-30 points

In order to test your server, write a console program that takes as a command line argument the IP Address and port number of the server as shown below:

./a.out localhost 51717

The program should prompt the user for inputs and display any messages received.

Here are example user inputs:

Please enter command: v #

the user enters a “v”, a space, and then a version number. This version number is now used in all new messages.

Please enter command: t # message string

the user enters a “t”, a space, and then a type number, followed by the message. Be sure you are able to handle the spaces in the message string.

Please enter command: q

the user enters a “q” causes the socket to be closed and the program to terminate.


Any messages received from the server should be displayed as followed:

Received Msg Type: #; Msg: message received
Problem #2 UDP Sockets

UDP Server (60 points)

Write a console program that takes as a command line argument the port number on which the UDP Server will receive messages. The UDP server collects parts of a larger composite message from the clients. The UDP server collects these message parts from different clients and assembles them in order, based on the lSeqNum. The UDP server keeps a running list of all clients that have sent a message to it and will broadcast the composite message to all clients when commanded. The UDP server needs to be able to receive data from clients without blocking the main application thread. The program needs to respond to user input while handling socket communications at the same time.



The program should continuously prompt the user for commands to execute like so:

Please enter command: 0

Please enter command: 1

Please enter command: 2

Composite Msg: current composite message



The data being sent back and forth will use the following packet structure:

struct udpMessage

{
unsigned char    nVersion;

unsigned char    nType;
unsigned short nMsgLen;
unsigned long    lSeqNum;

char chMsg[1000];
};

The UDP server needs to have the following functionality from the command prompt:

    • If command == 0 the server immediately sends to all clients the current composite message and clears out the composite message.

    • If command == 1 the server immediately clears out the composite message.

    • If command == 2 the server immediately displays to the console the composite message but takes no other actions.


The UDP server needs to have the following functionality when receiving messages:

    • If nVersion is not equal to 1 then the message is ignored.

    • If nType == 0 the composite message is immediately cleared and anything in the chMsg buffer is ignored.
    • If nType == 1 the composite message is immediately cleared and the message in chMsg is used as the start of a new composite message

    • If nType == 2 the message in chMsg is added to the composite message based on its lSeqNum
    • If nType == 3 the server immediately sends to all clients the current composite message and clears out the composite message.

If the composite message becomes larger than 1000 then the composite message (up to 1000) is immediately set out to all clients and any remaining characters are used to start a new composite message with a lSeqNum = 0.

UDP Client (40 points)

In order to test your server, write a console program that takes as a command line argument the IP Address and port number of the server as shown below:

./a.out localhost 51717

The program should prompt the user for inputs and display any messages received.

Here are example user inputs:

Please enter command: v #

the user enters a “v”, a space, and then a version number. This version number is now used in all new messages.

Please enter command: t # # message string

the user enters a “t”, a space, and then a type number, and then a sequence number, followed by the message (if any). Be sure you are able to handle the spaces in the message.

Please enter command: q

the user enters a “q” causes the socket to be closed and the program to terminate.


Any messages received should be displayed as followed:

Received Msg Type: 1, Seq: 33, Msg: message received

Appendix A: Coding Standards

Indentation:

When using if/for/while statements, make sure you indent 4 spaces for the content inside those. Also make sure that you use spaces to make the code more readable.

For example:

for (int i; i < 10; i++)

{

j = j + i;

}

If you have nested statements, you should use multiple indentions. Each { should be on its own line (like the for loop) If you have else or else if statements after your if statement, they should be on their own line.

for (int i; i < 10; i++)

{

if (i < 5)

{

counter++;

k -= i;

}

else

{

k +=1;

}

j += i;

}

Camel Case:

This naming convention has the first letter of the variable be lower case, and the first letter in each new word be capitalized (e.g. firstSecondThird). This applies for functions and member functions as well! The main exception to this is class names, where the first letter should also be capitalized.

Variable and Function Names:

Your variable and function names should be clear about what that variable or function is. Do not use one letter variables, but use abbreviations when it is appropriate (for example: “imag" instead of “imaginary”) . The more descriptive your variable and function names are, the more readable your code will be. This is the idea behind self-documenting code.






File Headers:

Every file should have the following header at the top /*

Author: <your name>

Class: ECE4122 or ECE6122

Last Date Modified: <date>

Description:

What is the purpose of this file?

*/

Code Comments:

    1. Every function must have a comment section describing the purpose of the function, the input and output parameters, the return value (if any).
    2. Every class must have a comment section to describe the purpose of the class.

    3. Comments need to be placed inside of functions/loops to assist in the understanding of the flow of the code.





































7
Appendix B: Accessing PACE-ICE Instructions

ACCESSING LINUX PACE-ICE CLUSTER (SERVER)

To access the PACE-ICE cluster you need certain software on your laptop or desktop system, as described below.


Windows Users:

Option 0 (Using SecureCRT)- THIS IS THE EASIEST OPTION!

The Georgia Tech Office of Information Technology (OIT) maintains a web page of software that can be downloaded and installed by students and faculty. That web page is:

http://software.oit.gatech.edu

From that page you will need to install SecureCRT.

To access this software, you will first have to log in with your Georgia Tech user name and password, then answer a series of questions regarding export controls.

Connecting using SecureCRT should be easy.

    • Open SecureCRT, you'll be presented with the "Quick Connect" screen.

    • Choose protocol "ssh2".

    • Enter the name of the PACE machine you wish to connect to in the "HostName" box (i.e. coc-ice.pace.gatech.edu)

    • Type your username in the "Username" box.

    • Click "Connect".

    • A new window will open, and you'll be prompted for your password.

Option 1 (Using Ubuntu for Windows 10):

Option 1 uses the Ubuntu on Windows program. This can only be downloaded if you are running Windows 10 or above. If using Windows 8 or below, use Options 2 or 3. It also requires the use of simple bash commands.

    1. Install Ubuntu for Windows 10 by following the guide from the following link: https://msdn.microsoft.com/en-us/commandline/wsl/install-win10

    2. Once Ubuntu for Windows 10 is installed, open it and type the following into the command line:


ssh **YourGTUsername**@coc-ice.pace.gatech.edu where **YourGTUsername** is replaced with your alphanumeric GT login. Ex: bkim334

    3. When it asks if you’re sure you want to connect, type in: yes

8
and type in your password when prompted (Note: When typing in your password, it will not show any characters typing)

4.    You’re now connected to PACE-ICE. You can edit files using vim by typing in:


vi filename.cc    OR    nano vilename.cpp

For a list of vim commands, use the following link:

https://coderwall.com/p/adv71w/basic-vim-commands-for-getting-started

5.    You’re able to edit, compile, run, and submit your code from this command line.


Option 2 (Using PuTTY):

Option 2 uses a program called PuTTY to ssh into the PACE-ICE cluster. It is easier to set up, but doesn’t allow you to access any local files from the command line. It also requires the use of simple bash commands.

    1. Download and install PuTTY from the following link: www.putty.org

    2. Once installed, open PuTTY and for the Host Name, type in: coc-ice.pace.gatech.edu and

for the port, leave it as 22.

    3. Click Open and a window will pop up asking if you trust the host. Click Yes and it will then ask you for your username and password. (Note: When typing in your password, it will not show any characters typing)


    4. You’re now connected to PACE-ICE. You can edit files using vim by typing in: vim filename.cc

OR    nano vilename.cpp



For a list of vim commands, use the following link:

https://coderwall.com/p/adv71w/basic-vim-commands-for-getting-started

5.    You’re able to edit, compile, run, and submit your code from this command line.




MacOS Users:.

Option 0 (Using the Terminal to SSH into PACE-ICE):


9
This option uses the built-in terminal in MacOS to ssh into PACE-ICE and use a command line text editor to edit your code.

    1. Open Terminal from the Launchpad or Spotlight Search.


    2. Once you’re in the terminal, ssh into PACE-ICE by typing:


ssh **YourGTUsername**@ coc-ice.pace.gatech.edu where **YourGTUsername** is replaced with your alphanumeric GT login. Ex: bkim334
    3. When it asks if you’re sure you want to connect, type in: yes

and type in your password when prompted (Note: When typing in your password, it will not show any characters typing)

    4. You’re now connected to PACE-ICE. You can edit files using vim by typing in:


vi filename.cc    OR    nano filename.cpp

For a list of vim commands, use the following link: https://coderwall.com/p/adv71w/basic-vim-commands-for-getting-started
5.    You’re able to edit, compile, run, and submit your code from this command line.


Linux Users:

If you’re using Linux, follow Option 0 for MacOS users.






















10
Appendix B: Submitting Assignment

Step-By-Step Submitting a Tar.gz

PLEASE NOTE: All the following instructions are run on PACE. If you are struggling with any of the steps, please come see the TAs during office hours. Better to start and test early than wait until the last minute.

Below is a step-by-step tutorial on how to create the .tgz file for Homework 4 for ECE 4122/6122. Please know, if you are in 4122 you do not need to submit anything for Problem 2. Additionally, if you do not use a header file for a solution, you do not need to submit a header file. Please adjust these instructions accordingly. The tarball should contain a folder with your buzzid containing subfolders for each problem you are assigned with the corresponding .cpp and .h files. Each problem will have a SERVER and CLIENT folder with corresponding code.

Please make sure that each problem is in its own subfolder with the naming conventions: <FirstName_LastName>_Hmk4Prob# (where # is either 1 or 2) in addition to the SERVER and CLIENT folders:
































Create a subdirectory named buzzid in the current working directory by executing the following command in the shell:
$ mkdir buzzed

(In this case my buzzid is tlagrow3)




11




























Create a text file named manifest.


Please make sure that the manifest file is a plain text file and not a rich text file. Microsoft word will generate a rich text file. The easiest method to create a plain text file is to use a command line editor such as vi, vim, or nano.

(If you want a tutorial, these can be usefule: vi:

http://heather.cs.ucdavis.edu/~matloff/UnixAndC/Editors/ViIntro.html, vim: https://openvim.com/, nano: https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/)







The editor will open:















12




You will need to insert test into this file. Press the ‘i’ key on the keyboard to insert text:


















Populate the manifest file with the following:

buzzid/<FirstName_LastName>_Hmk4Prob1/SERVER/*.cpp buzzid/<FirstName_LastName>_Hmk4Prob1/SERVER/*.h buzzid/<FirstName_LastName>_Hmk4Prob1/CLIENT/*.cpp buzzid/<FirstName_LastName>_Hmk4Prob1/CLIENT/*.h buzzid/<FirstName_LastName>_Hmk4Prob2/SERVER/*.cpp buzzid/<FirstName_LastName>_Hmk4Prob2/SERVER/*.h buzzid/<FirstName_LastName>_Hmk4Prob2/CLIENT/*.cpp buzzid/<FirstName_LastName>_Hmk4Prob2/CLIENT/*.h


(PLEASE NOTE: this is subject to change with depending on your class section. The wildcard (*) character will grab all the .cpp and .h files you generated for each problem.)
























13
To save the file, hold the Shift key and press ‘ZZ’. This command will save the text and exit in the vim text editor. To check that the file saved, you can use the command ‘$cat <filename>’ to print out all the lines:



















Now you need to construct the correct file structure for the submission. This means that you need to put all the homework files into your buzzid folder. Execute the following lines in the shell:

$ cp -a <FirstName_LastName>_* buzzid






































14

Many people have had issue with this step. You need to make sure the naming conventions are consistent to avoid potential problems.

It is now time to tarball your submission. If all the other steps have gone smoothly, execute the following command:

$ tar -zcvf buzzid-hmk4.tgz $(cat manifest)

This command will generate a new tgz file with all of the specified files and folders in the manifest text document:






















You can now check the new tgz file just generated with the following command:

$ tar -ztvf buzzid-hmk4.tgz

















If your file has the same structure as above, you are all good to submit!







15

More products