Intro. to Network Programming Homework 3 – Bulletin Board System: Part 3

$35.00

Category: You will Instantly receive a download link for .zip solution file upon Payment || To Order Original Work Click Custom Order?

Description

Rate this product

Description
In this part, you are going to write a client program for BBS service. However, in this part, the content of the
post will store on the client-side (Amazon S3) instead of the server-side. Take the post function of the BBS service,
for example. The server in this part only stores the metadata of posts (e.g., post id, post title, author and date.)
except for the content of the post. That is to say, each client has its storage to store the content of their posts,
and we use Amazon S3 for the storage service. Besides, you are also going to implement new features such as a
simple mail service.
System Architecture
The server here only stores user information, boards and some metadata of posts. (e.g., post id, post title,
etc). The real content of the post will store on the client-side (Amazon S3). Each bucket of Amazon S3
represents the storage of each client. So, each client can store the content of its posts in its bucket, and this
bucket is also an incoming mailbox for the mail service of this client. Note that only your client program can
get access to Amazon S3 using Amazon S3 API.
Requirements
The service can serve at least 10 clients. Your server and client program must be able to handle all commands
in the previous part (output results must be the same as the previous part). For some commands such as
whoami, exit, logout, create-board, list-board ## and list-post ##, your client
program only sends the command to the server and gets the corresponding result from the server. However, there
are some commands that your client program will interact with Amazon S3. These commands are described as
follows:
Command format Description Result
register If successful execution, your client
program will create a new bucket in
Amazon S3 for this new user, and your
server program will store the bucket
name of this new user so that the user
will be able to log in with its bucket in the
future.
If failed, only print the error message.
Success Register successfully.
Fail Username is already used.
login If successful execution, the user will log
in with its Amazon S3 bucket, so that it
can manipulate (e.g., upload posts,
delete posts, etc) its bucket in the future.
If failed, only print the error message.
Success Welcome, .
Fail (1) Please logout first.
Fail (2) Login failed.
create-post –title —<br /> content <content><br /> (command is in the same line )<br /> If successful execution, the user (client)<br /> will upload the content of this post to<br /> its S3 bucket using Amazon S3 API,<br /> and the server will keep the metadata of<br /> this post.<br /> If failed, only print the error message.<br /> Success Create post successfully.<br /> Fail (1) Board does not exist.<br /> Fail (2) Please login first.<br /> read <post-id> Show the post whose ID is <post-id>.<br /> If successful execution, the client will<br /> get the content of this post from the<br /> post owner’s bucket using Amazon S3<br /> API and print the result.<br /> If failed, only print the error message.<br /> Success Author :<Author1><br /> Title :<Title1><br /> Date :<Date1><br /> —<br /> <content><br /> —<br /> <User1>:<Comment1><br /> Fail Post does not exist.<br /> delete-post <post-id> Delete the post whose ID is <post-id>.<br /> If successful execution, the user (client)<br /> will delete this post from its bucket,<br /> and the server will delete the metadata<br /> of this post.<br /> If failed, only print the error message.<br /> Success Delete successfully.<br /> Fail (1) Please login first.<br /> Fail (2) Post does not exist.<br /> Fail (3) Not the post owner.<br /> update-post <post-id> –title/content <new> Update the post whose ID is <post-id>.<br /> If a successful update on the title, the<br /> server will update the title of this post.<br /> If a successful update on the content, the<br /> user (client) will update the content of<br /> this post in Amazon S3 using Amazon<br /> S3 API.<br /> If failed, only print the error message.<br /> Success Update successfully.<br /> Fail (1) Please login first.<br /> Fail (2) Post does not exist.<br /> Fail (3) Not the post owner.<br /> comment <post-id> <comment> Add a comment < comment > to the post<br /> whose ID is <post-id>.<br /> If successful execution, the user (client)<br /> will append the comment to the content<br /> of this post in the post owner’s bucket.<br /> That is to say, the comment stores in the<br /> post owner’s bucket.<br /> If failed, only print the error message.<br /> Success Comment successfully.<br /> Fail (1) Please login first.<br /> Fail (2) Post does not exist.<br /> Also, there are some new commands you have to implement for simple mail service. These commands are<br /> described as follows:<br /> Command format Description Result<br /> mail-to <username> –subject <subject><br /> –content <content><br /> (command is in the same line )<br /> Send a mail whose subject is <subject><br /> and content is <content> to user<br /> <username>.<br /> Use –subject and –content to separate<br /> subject and content.<br /> <subject> has the same format as <title><br /> of the post.<br /> <content> has the same format as<br /> <content> of the post.<br /> If successful execution, the user (client)<br /> will create an object with <content> in<br /> user <username>’s bucket using<br /> Amazon S3 API.<br /> Failed execution:<br /> Fail (1): No user logged in.<br /> Fail (2): User <username> doesn’t exist.<br /> Success Sent successfully.<br /> Fail (1) Please login first.<br /> Fail (2) <username> does not exist.<br /> list-mail List all incoming mails of the current<br /> logged in user.<br /> Success:<br /> Note that each user has its mail id<br /> sequence numbers. It should start at<br /> 1.<br /> Success ID Subject From Date<br /> 1 <Subject1><From_user1> <Date1><br /> 2 <Subject2><From_user2> <Date2><br /> Fail (1) Please login first.<br /> <Subject1> represents the subject of this<br /> mail.<br /> <From_user1> represents that this mail<br /> is sent by user <From_user1>.<br /> <Date1> represents the sent date of this<br /> mail.<br /> There is a \t between each column.<br /> Failed execution:<br /> Fail (1): No user logged in.<br /> retr-mail <mail#> Retrieve the content of the mail <mail#><br /> If successful execution, the user (client)<br /> will get the content of the mail from its<br /> bucket using Amazon S3 API and print<br /> the result.<br /> <Subject1> represents the subject of this<br /> mail.<br /> <From_user1> represents that this mail<br /> is sent by user <From_user1>.<br /> <Date1> represents the sent date of this<br /> mail.<br /> There is a \t before ‘:’.<br /> Failed execution:<br /> Fail (1): No user logged in.<br /> Fail (2): Mail <mail#> is not in your<br /> mailbox.<br /> Success Subject :<Subject1><br /> From :<From_user1><br /> Date :<Date1><br /> —<br /> <content><br /> Fail (1) Please login first.<br /> Fail (2) No such mail.<br /> delete-mail <mail#> Delete mail <mail#> from your mailbox.<br /> If successful execution, the user (client)<br /> will delete the content of the mail from<br /> its bucket using Amazon S3 API.<br /> Failed execution:<br /> Fail (1): No user logged in.<br /> Fail (2): Mail <mail#> is not in your<br /> mailbox.<br /> Success Mail deleted.<br /> Fail (1) Please login first.<br /> Fail (2) No such mail.<br /> Scenario<br /> Run your server first, and run your client program to connect to your server. If the line only shows “% “, that means<br /> we type <Enter> in our client program. It is just for the height alignment of two columns here. You can ignore that.<br /> The sample outputs of the client program are listed as follows:<br /> Terminal output Description and Amazon S3 Console State<br /> Start with nothing in your Amazon S3.<br /> bash$ ./client 127.0.0.1 7890<br /> ********************************<br /> ** Welcome to the BBS server. **<br /> ********************************<br /> % register Brad bb@cs.nctu.edu.tw 12345<br /> Register successfully.<br /> %<br /> Create a bucket for user Brad. You can name the bucket name<br /> of each user by yourself, but there are some limitations of the<br /> bucket name. Please refer to the Note part.<br /> % register Brad bb@cs.nctu.edu.tw 12345<br /> Username is already used.<br /> Just print the error message. Nothing changes in Amazon S3.<br /> % register V v@cs.nctu.edu.tw bt21<br /> Register successfully.<br /> %<br /> %<br /> %<br /> %<br /> Create a bucket for user V.<br /> % login Brad 12345<br /> Welcome, Brad.<br /> The client program will log in with Brad’s bucket.<br /> % whoami<br /> Brad<br /> Nothing changes in Amazon S3.<br /> % create-board NP_HW<br /> Create board successfully.<br /> Nothing changes in Amazon S3.<br /> % create-board NP_HW<br /> Board already exist.<br /> Nothing changes in Amazon S3.<br /> % list-board<br /> Index Name Moderator<br /> 1 NP_HW Brad<br /> %<br /> %<br /> Nothing changes in Amazon S3.<br /> % list-board ##HW<br /> Index Name Moderator<br /> 1 NP_HW Brad<br /> Nothing changes in Amazon S3.<br /> % create-post NP_HW –title NP_HW3 –content Err…<br />Ha!<br /> Create post successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> Create an object to store the content of this post in Brad’s<br /> bucket. By the way, you can name the object by yourself, but<br /> there are some restrictions for object naming. Please refer to<br /> the Note part.<br /> % create-post NCTU –title NP_HW3 –content Uh…<br /> Board does not exist.<br /> Nothing changes in Amazon S3.<br /> % create-post NP_HW –title NP_HW4 –content Wow…<br /> Create post successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> Create a new post.<br /> % list-post NP<br /> Board does not exist.<br /> %<br /> %<br /> Nothing changes in Amazon S3.<br /> % list-post NP_HW<br /> ID Title Author Date<br /> 1 NP_HW3 Brad 04/14<br /> 2 NP_HW4 Brad 04/14<br /> Nothing changes in Amazon S3.<br /> % list-post NP_HW ##HW3<br /> ID Title Author Date<br /> 1 NP_HW3 Brad 04/14<br /> Nothing changes in Amazon S3.<br /> % read 888<br /> Post does not exist.<br /> %<br /> %<br /> %<br /> Nothing changes in Amazon S3.<br /> % read 1<br /> Author :Brad<br /> Title :NP_HW3<br /> Date :2020-04-14<br /> —<br /> Err…<br /> Ha!<br /> —<br /> Get the content of post 1 from the post owner’s bucket.<br /> % update-post 888 –title NP HW_4<br /> Post does not exist.<br /> Nothing changes in Amazon S3.<br /> % update-post 1 –title NP HW_4<br /> Update successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> The state of Amazon S3 may be unchanged. It depends on your<br /> design. But for my design, I changed the object key of that post.<br /> % read 1<br /> Author :Brad<br /> Title :NP HW_4<br /> Date :2020-04-14<br /> —<br /> Err…<br /> Ha!<br /> —<br /> Get the content of post 1 from the post owner’s bucket.<br /> % update-post 1 –content Yeah!<br /> Update successfully.<br /> Update the content of this post in Amazon S3.<br /> % read 1<br /> Author :Brad<br /> Title :NP HW_4<br /> Date :2020-04-14<br /> —<br /> Yeah!<br /> —<br /> Get the content of post 1 from the post owner’s bucket.<br /> % logout<br /> Bye, Brad.<br /> Nothing changes in Amazon S3.<br /> % whoami Nothing changes in Amazon S3.<br /> Please login first.<br /> % logout<br /> Please login first.<br /> Nothing changes in Amazon S3.<br /> % login V bt21<br /> Welcome, V.<br /> The client program will login with V’s bucket.<br /> % create-post NP_HW –title Hello –content I am</p> <p>V.<br /> Create post successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> % update-post 1 –content Ha!<br />ha!<br /> Not the post owner.<br /> Nothing changes in Amazon S3.<br /> % delete-post 1<br /> Not the post owner.<br /> Nothing changes in Amazon S3.<br /> % comment 888 Ha ha!<br /> Post does not exist.<br /> Nothing changes in Amazon S3.<br /> % comment 1 Ha ha!<br /> Comment successfully.<br /> %<br /> The client program will append the comment to the<br /> corresponding post object (e.g., NP_HW_4-<br /> 1586850747968524907 object in Brad’s bucket) in Amazon S3.<br /> % read 1<br /> Author :Brad<br /> Title :NP HW_4<br /> Date :2020-04-14<br /> —<br /> Yeah!<br /> —<br /> V:Ha ha!<br /> Get the content of post 1 from the post owner’s bucket.<br /> % mail-to TT –subject Hi TT –content Hi <br /> TT!<br /> TT does not exist.<br /> Nothing changes in Amazon S3.<br /> % mail-to Brad –subject Hi Brad –content Hi <br /> Brad!<br /> Sent successfully.<br /> % mail-to Brad –subject Hey –content Hey <br />Brad!<br /> Sent successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> User V creates two email objects in Brad’s bucket.<br /> % list-mail<br /> ID Subject From Date<br /> Nothing changes in Amazon S3.<br /> % delete-mail 1<br /> No such mail.<br /> Nothing changes in Amazon S3.<br /> % retr-mail 1<br /> No such mail.<br /> Nothing changes in Amazon S3.<br /> % logout<br /> Bye, V.<br /> Nothing changes in Amazon S3.<br /> % login Brad 12345<br /> Welcome, Brad.<br /> The client program will login with Brad’s bucket.<br /> % list-mail<br /> ID Subject From Date<br /> 1 Hi Brad V 04/14<br /> 2 Hey V 04/14<br /> Nothing changes in Amazon S3.<br /> % retr-mail 1<br /> Subject :Hi Brad<br /> From :V<br /> Date :2020-04-14<br /> —<br /> Hi<br /> Brad!<br /> Get the content of the mail from his bucket.<br /> % mail-to V –subject Hi V –content WoW V!<br /> Sent successfully.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> User Brad creates a mail object in V’s bucket.<br /> % logout<br /> Bye, Brad.<br /> Nothing changes in Amazon S3.<br /> % login V bt21<br /> Welcome, V.<br /> The client program will login with V’s bucket.<br /> % list-mail<br /> ID Subject From Date<br /> 1 Hi V Brad 04/14<br /> Nothing changes in Amazon S3. But note that user V has its<br /> mail id sequence number. It starts at 1.<br /> % logout<br /> Bye, V.<br /> Nothing changes in Amazon S3.<br /> % login Brad 12345<br /> Welcome, Brad.<br /> The client program will login with Brad’s bucket.<br /> % list-mail<br /> ID Subject From Date<br /> 1 Hi Brad V 04/14<br /> 2 Hey V 04/14<br /> Nothing changes in Amazon S3.<br /> % delete-mail 1<br /> Mail deleted.<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> %<br /> User Brad deletes the object corresponding to his mail 1 from<br /> his bucket.<br /> % list-mail<br /> ID Subject From Date<br /> 1 Hey V 04/14<br /> Nothing changes in Amazon S3. But note that ID of the mail with<br /> the subject “Hey” is 1.<br /> % logout<br /> Bye, Brad.<br /> Nothing changes in Amazon S3.<br /> % exit Nothing changes in Amazon S3.<br /> Note<br /> 1. About bucket naming:<br /> • Bucket names must be unique across all existing bucket names in Amazon S3.<br /> • Bucket names must be at least 3 and no more than 63 characters long.<br /> • Bucket names must not contain uppercase characters or underscores.<br /> • Bucket names must start with a lowercase letter or number.<br /> 2. About object key name:<br /> • Unique identifier within a bucket. If you upload the same key name object without versioning-enabled, it will<br /> overwrite the original one.<br /> • The following character sets are generally safe for use in key names.<br /> For more details about buckets and objects, you can refer to reference [5][6]<br /> 3. About AWS API access key:<br /> If you want to use AWS SDK to make Amazon S3 API calls, you have to provide your AWS credential first.<br /> How to set up authentication credential:<br /> Create a credential file at ~/.aws/credentials. The content of this file is described as follows:<br /> [default]<br /> aws_access_key_id=<your access key><br /> aws_secret_access_key=<your secret access key><br /> aws_session_token=<your session token><br /> You can get these key from your AWS Educate account. Log in your account and go to Intro. to Network<br /> Programming classroom. Then, you will see the following page.<br /> Click Account Details<br /> Click Show and copy those keys into ~/.aws/credentials<br /> The credential we use here is temporary, so you have to copy and paste again when the credential<br /> expiration.<br /> 4. About C++ AWS SDK:<br /> To use the AWS SDK for C++, you need:<br /> ⚫ Visual Studio 2015 or later<br /> ⚫ or GNU Compiler Collection (GCC) 4.9 or later<br /> ⚫ or Clang 3.3 or later<br /> ⚫ A minimum of 4 GB of RAM<br /> So, if you currently use Amazon EC2 with instance type of t2.micro, please change to at least t2.medium.<br /> Moreover, please backup all your environment when you are running out of classroom credits. We suggest<br /> you write a script to set up your environment. It will save a lot of time.<br /> How to change instance type:<br /> Right-click your original instance -> Instance Settings -> Change Instance Type<br /> 5. You can use any code examples in the Amazon S3 API documentation to manipulate your Amazon<br /> S3.<br /> Grade (100%)<br /> For those commands that interact with Amazon S3, we will check your Amazon S3 console. If the state of<br /> your Amazon S3 is wrong, we will deduct some scores of that command.<br /> ⚫ register command – (8%)<br /> ⚫ login command – (8%)<br /> ⚫ create-post command – (8%)<br /> ⚫ read command – (8%)<br /> ⚫ delete-post command – (8%)<br /> ⚫ update-post command – (8%)<br /> ⚫ comment command – (8%)<br /> ⚫ mail-to command – (8%)<br /> ⚫ list-mail command – (8%)<br /> ⚫ retr-mail command – (8%)<br /> ⚫ delete-mail command – (8%)<br /> ⚫ list-post command – (5%)<br /> ⚫ logout command – (2%)<br /> ⚫ exit command – (2%)<br /> ⚫ whoami command – (1%)<br /> ⚫ create-board command – (1%)<br /> ⚫ list-board command – (1%)<br /> Submission<br /> Please upload a zip file called “hw3_{$student_id}.zip” (e.g., hw3_0856020.zip) that includes your source code. It<br /> must include at least your server source code and client source code. Submission that doesn’t follow the rule<br /> will get 20% punishment on the grade.<br /> You will get 0 points on this project for plagiarism. Please don’t copy-paste other students’ code!<br /> Reference<br /> 1. C/C++ Socket<br /> 2. SQLite C/C++ Interface<br /> 3. Linux socket SELECT<br /> 4. AWS SDK supported languages<br /> 5. Bucket Restrictions and Limitations<br /> 6. Object Key and Metadata<br /> 7. AWS Command Line Interface<br /> 8. AWS SDK for C++<br /> 9. AWS SDK for Python<br /> 10. Sequence diagram reference</p> </div> </div> <section class="related products"> <h2>Related products</h2> <ul class="products columns-3"> <li class="product type-product post-13443 status-publish first instock product_cat-intro-to-network-programming product_tag-bulletin-board-system product_tag-implement-the-functions product_tag-intro-to-network product_tag-part-2 product_tag-programming-homework-2 has-post-thumbnail downloadable virtual purchasable product-type-simple"> <a href="https://codingprolab.com/assignment/intro-to-network-programming-homework-2-bulletin-board-system-part-2/" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"><img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" decoding="async" srcset="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?w=225&ssl=1 225w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=100%2C100&ssl=1 100w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=150%2C150&ssl=1 150w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=75%2C75&ssl=1 75w" sizes="(max-width: 225px) 100vw, 225px" /><h2 class="woocommerce-loop-product__title">Intro. to Network Programming Homework 2 – Bulletin Board System: Part 2</h2> <span class="price"><span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol">$</span>35.00</bdi></span></span> </a><a href="?add-to-cart=13443" aria-describedby="woocommerce_loop_add_to_cart_link_describedby_13443" data-quantity="1" class="button product_type_simple add_to_cart_button ajax_add_to_cart" data-product_id="13443" data-product_sku="" aria-label="Add to cart: “Intro. to Network Programming Homework 2 - Bulletin Board System: Part 2”" rel="nofollow" data-success_message="“Intro. to Network Programming Homework 2 - Bulletin Board System: Part 2” has been added to your cart">Buy This Answer</a> <span id="woocommerce_loop_add_to_cart_link_describedby_13443" class="screen-reader-text"> </span> </li> <li class="product type-product post-13440 status-publish instock product_cat-intro-to-network-programming has-post-thumbnail downloadable virtual purchasable product-type-simple"> <a href="https://codingprolab.com/assignment/intro-to-network-programming-homework-1-bulletin-board-system-part-1/" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"><img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" decoding="async" srcset="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?w=225&ssl=1 225w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=100%2C100&ssl=1 100w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=150%2C150&ssl=1 150w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=75%2C75&ssl=1 75w" sizes="(max-width: 225px) 100vw, 225px" /><h2 class="woocommerce-loop-product__title">Intro. to Network Programming Homework 1 – Bulletin Board System: Part 1</h2> <span class="price"><span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol">$</span>35.00</bdi></span></span> </a><a href="?add-to-cart=13440" aria-describedby="woocommerce_loop_add_to_cart_link_describedby_13440" data-quantity="1" class="button product_type_simple add_to_cart_button ajax_add_to_cart" data-product_id="13440" data-product_sku="" aria-label="Add to cart: “Intro. to Network Programming Homework 1 - Bulletin Board System: Part 1”" rel="nofollow" data-success_message="“Intro. to Network Programming Homework 1 - Bulletin Board System: Part 1” has been added to your cart">Buy This Answer</a> <span id="woocommerce_loop_add_to_cart_link_describedby_13440" class="screen-reader-text"> </span> </li> <li class="product type-product post-13447 status-publish last instock product_cat-intro-to-network-programming product_tag-bbs-service product_tag-bulletin-board-system product_tag-intro-to-network product_tag-programming-homework-4 product_tag-pub-sub-system has-post-thumbnail downloadable virtual purchasable product-type-simple"> <a href="https://codingprolab.com/assignment/intro-to-network-programming-homework-4-bulletin-board-system-pub-sub-system/" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"><img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" decoding="async" loading="lazy" srcset="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?w=225&ssl=1 225w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=100%2C100&ssl=1 100w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=150%2C150&ssl=1 150w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=75%2C75&ssl=1 75w" sizes="auto, (max-width: 225px) 100vw, 225px" /><h2 class="woocommerce-loop-product__title">Intro. to Network Programming Homework 4 – Bulletin Board System: Pub/Sub system</h2> <span class="price"><span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol">$</span>35.00</bdi></span></span> </a><a href="?add-to-cart=13447" aria-describedby="woocommerce_loop_add_to_cart_link_describedby_13447" data-quantity="1" class="button product_type_simple add_to_cart_button ajax_add_to_cart" data-product_id="13447" data-product_sku="" aria-label="Add to cart: “Intro. to Network Programming Homework 4 - Bulletin Board System: Pub/Sub system”" rel="nofollow" data-success_message="“Intro. to Network Programming Homework 4 - Bulletin Board System: Pub/Sub system” has been added to your cart">Buy This Answer</a> <span id="woocommerce_loop_add_to_cart_link_describedby_13447" class="screen-reader-text"> </span> </li> </ul> </section> <nav class="storefront-product-pagination" aria-label="More products"> <a href="https://codingprolab.com/assignment/intro-to-network-programming-homework-2-bulletin-board-system-part-2/" rel="prev"> <img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" loading="lazy" /> <span class="storefront-product-pagination__title">Intro. to Network Programming Homework 2 - Bulletin Board System: Part 2</span> </a> <a href="https://codingprolab.com/assignment/intro-to-network-programming-homework-4-bulletin-board-system-pub-sub-system/" rel="next"> <img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" loading="lazy" /> <span class="storefront-product-pagination__title">Intro. to Network Programming Homework 4 - Bulletin Board System: Pub/Sub system</span> </a> </nav><!-- .storefront-product-pagination --> </div> </main><!-- #main --> </div><!-- #primary --> </div><!-- .col-full --> </div><!-- #content --> <footer id="colophon" class="site-footer" role="contentinfo"> <div class="col-full"> <div class="footer-widgets row-1 col-4 fix"> <div class="block footer-widget-1"> <div id="block-42" class="widget widget_block"><div class="wp-block-jetpack-contact-info"><div class="wp-block-jetpack-email"><a href="mailto:codingprolab@gmail.com">codingprolab@gmail.com</a></div> <div class="wp-block-jetpack-phone"><a href="tel:+15414237793">+1(541) 423-7793</a></div> <div class="wp-block-jetpack-address"><div class="jetpack-address__address jetpack-address__address1">Alabama</div></div></div></div><div id="block-46" class="widget widget_block"><div class="wp-block-jetpack-rating-star" style="text-align:left" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating"><p><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span></p><span style="display: none;" itemprop="worstRating" content="0.5"><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" itemprop="bestRating" content="5"><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span itemprop="ratingValue" class="screen-reader-text" content="5">Rating: 5 out of 5.</span></div></div> </div> <div class="block footer-widget-2"> <div id="block-43" class="widget widget_block widget_media_image"><figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="329" height="153" src="https://codingprolab.com/wp-content/uploads/2020/10/download.jpg" alt="" class="wp-image-68" srcset="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download.jpg?w=329&ssl=1 329w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download.jpg?resize=300%2C140&ssl=1 300w" sizes="auto, (max-width: 329px) 100vw, 329px" /><figcaption class="wp-element-caption">All Rights Reserved @copyright <a href="https://codingprolab.com">codingprolab</a> 2024</figcaption></figure></div><div id="block-53" class="widget widget_block widget_text"><p><a href="https://codingprolab.com/">Codingprolab</a> is the sole owner/licensee of all intellectual property rights in its Website content including all the software text, software design, text contained within and alongside the graphics or pictures, information contained with in any software or the Website itself.</p></div> </div> <div class="block footer-widget-3"> <div id="block-64" class="widget widget_block widget_media_image"><figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="108" src="https://codingprolab.com/wp-content/uploads/2021/09/icon-cc-1024x108.png" alt="" class="wp-image-17622" srcset="https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=1024%2C108&ssl=1 1024w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=416%2C44&ssl=1 416w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=300%2C32&ssl=1 300w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=768%2C81&ssl=1 768w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=1536%2C162&ssl=1 1536w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=260%2C27&ssl=1 260w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=50%2C5&ssl=1 50w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=150%2C16&ssl=1 150w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?resize=600%2C63&ssl=1 600w, https://i0.wp.com/codingprolab.com/wp-content/uploads/2021/09/icon-cc.png?w=1792&ssl=1 1792w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>All Payments Are Secured</figcaption></figure></div><div id="block-65" class="widget widget_block"><div class="wp-block-jetpack-rating-star" style="text-align:left" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating"><p><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span><span aria-hidden="true">⭐</span></p><span style="display: none;" itemprop="worstRating" content="0.5"><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" ><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span style="display: none;" itemprop="bestRating" content="5"><span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span> <span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path class="" fill="currentColor" stroke="currentColor" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" /> </svg> </span></span><span itemprop="ratingValue" class="screen-reader-text" content="5">Rating: 5 out of 5.</span></div></div> </div> <div class="block footer-widget-4"> <div id="block-47" class="widget widget_block widget_text"><p>TERMS AND CONDITI<strong>ONS</strong></p></div><div id="block-51" class="widget widget_block widget_text"><p>The reference codes provided by <a href="https://codingprolab.com">codingprolab.com</a> serve as tutorial codes on past projects for students and are not to be submitted as it is. These codes are intended to be used for research and reference purposes only.</p></div><div id="block-61" class="widget widget_block"><ul class="wp-block-list"><li><strong>SERVICES</strong></li><li><a href="https://codingprolab.com/order-now/">Programming Help</a></li><li><a href="https://codingprolab.com/shop/">Programming Tutorials</a></li><li><a href="https://codingprolab.com/order-now/">Essay/Academic Writing Help</a></li></ul></div> </div> </div><!-- .footer-widgets.row-1 --> <div class="site-info"> © CodingProlab 2025 <br /> <a href="https://woocommerce.com" target="_blank" title="WooCommerce - The Best eCommerce Platform for WordPress" rel="noreferrer nofollow">Built with Storefront & WooCommerce</a>. </div><!-- .site-info --> <div class="storefront-handheld-footer-bar"> <ul class="columns-3"> <li class="my-account"> <a href="https://codingprolab.com/my-account/">My Account</a> </li> <li class="search"> <a href="">Search</a> <div class="site-search"> <div class="widget woocommerce widget_product_search"><form role="search" method="get" class="woocommerce-product-search" action="https://codingprolab.com/"> <label class="screen-reader-text" for="woocommerce-product-search-field-1">Search for:</label> <input type="search" id="woocommerce-product-search-field-1" class="search-field" placeholder="Search products…" value="" name="s" /> <button type="submit" value="Search" class="">Search</button> <input type="hidden" name="post_type" value="product" /> </form> </div> </div> </li> <li class="cart"> <a class="footer-cart-contents" href="https://codingprolab.com/cart/">Cart <span class="count">0</span> </a> </li> </ul> </div> </div><!-- .col-full --> </footer><!-- #colophon --> <section class="storefront-sticky-add-to-cart"> <div class="col-full"> <div class="storefront-sticky-add-to-cart__content"> <img width="225" height="225" src="https://i0.wp.com/codingprolab.com/wp-content/uploads/2020/10/download-1.jpg?resize=225%2C225&ssl=1" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" loading="lazy" /> <div class="storefront-sticky-add-to-cart__content-product-info"> <span class="storefront-sticky-add-to-cart__content-title">You're viewing: <strong>Intro. to Network Programming Homework 3 – Bulletin Board System: Part 3</strong></span> <span class="storefront-sticky-add-to-cart__content-price"><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>35.00</span></span> </div> <a href="?add-to-cart=13445" class="storefront-sticky-add-to-cart__content-button button alt" rel="nofollow"> Buy This Answer </a> </div> </div> </section><!-- .storefront-sticky-add-to-cart --> </div><!-- #page --> <!-- Click to Chat - https://holithemes.com/plugins/click-to-chat/ v4.16 --> <div class="ht-ctc ht-ctc-chat ctc-analytics ctc_wp_desktop style-2 " id="ht-ctc-chat" style="display: none; position: fixed; bottom: 15px; right: 15px;" > <div class="ht_ctc_style ht_ctc_chat_style"> <div style="display: flex; justify-content: center; align-items: center; " class="ctc-analytics ctc_s_2"> <p class="ctc-analytics ctc_cta ctc_cta_stick ht-ctc-cta ht-ctc-cta-hover " style="padding: 0px 16px; line-height: 1.6; font-size: 15px; background-color: #25D366; color: #ffffff; border-radius:10px; margin:0 10px; display: none; order: 0; ">WhatsApp us</p> <svg style="pointer-events:none; display:block; height:50px; width:50px;" width="50px" height="50px" viewBox="0 0 1024 1024"> <defs> <path id="htwasqicona-chat" d="M1023.941 765.153c0 5.606-.171 17.766-.508 27.159-.824 22.982-2.646 52.639-5.401 66.151-4.141 20.306-10.392 39.472-18.542 55.425-9.643 18.871-21.943 35.775-36.559 50.364-14.584 14.56-31.472 26.812-50.315 36.416-16.036 8.172-35.322 14.426-55.744 18.549-13.378 2.701-42.812 4.488-65.648 5.3-9.402.336-21.564.505-27.15.505l-504.226-.081c-5.607 0-17.765-.172-27.158-.509-22.983-.824-52.639-2.646-66.152-5.4-20.306-4.142-39.473-10.392-55.425-18.542-18.872-9.644-35.775-21.944-50.364-36.56-14.56-14.584-26.812-31.471-36.415-50.314-8.174-16.037-14.428-35.323-18.551-55.744-2.7-13.378-4.487-42.812-5.3-65.649-.334-9.401-.503-21.563-.503-27.148l.08-504.228c0-5.607.171-17.766.508-27.159.825-22.983 2.646-52.639 5.401-66.151 4.141-20.306 10.391-39.473 18.542-55.426C34.154 93.24 46.455 76.336 61.07 61.747c14.584-14.559 31.472-26.812 50.315-36.416 16.037-8.172 35.324-14.426 55.745-18.549 13.377-2.701 42.812-4.488 65.648-5.3 9.402-.335 21.565-.504 27.149-.504l504.227.081c5.608 0 17.766.171 27.159.508 22.983.825 52.638 2.646 66.152 5.401 20.305 4.141 39.472 10.391 55.425 18.542 18.871 9.643 35.774 21.944 50.363 36.559 14.559 14.584 26.812 31.471 36.415 50.315 8.174 16.037 14.428 35.323 18.551 55.744 2.7 13.378 4.486 42.812 5.3 65.649.335 9.402.504 21.564.504 27.15l-.082 504.226z"/> </defs> <linearGradient id="htwasqiconb-chat" gradientUnits="userSpaceOnUse" x1="512.001" y1=".978" x2="512.001" y2="1025.023"> <stop offset="0" stop-color="#61fd7d"/> <stop offset="1" stop-color="#2bb826"/> </linearGradient> <use xlink:href="#htwasqicona-chat" overflow="visible" style="fill: url(#htwasqiconb-chat)" fill="url(#htwasqiconb-chat)"/> <g> <path style="fill: #FFFFFF;" fill="#FFF" d="M783.302 243.246c-69.329-69.387-161.529-107.619-259.763-107.658-202.402 0-367.133 164.668-367.214 367.072-.026 64.699 16.883 127.854 49.017 183.522l-52.096 190.229 194.665-51.047c53.636 29.244 114.022 44.656 175.482 44.682h.151c202.382 0 367.128-164.688 367.21-367.094.039-98.087-38.121-190.319-107.452-259.706zM523.544 808.047h-.125c-54.767-.021-108.483-14.729-155.344-42.529l-11.146-6.612-115.517 30.293 30.834-112.592-7.259-11.544c-30.552-48.579-46.688-104.729-46.664-162.379.066-168.229 136.985-305.096 305.339-305.096 81.521.031 158.154 31.811 215.779 89.482s89.342 134.332 89.312 215.859c-.066 168.243-136.984 305.118-305.209 305.118zm167.415-228.515c-9.177-4.591-54.286-26.782-62.697-29.843-8.41-3.062-14.526-4.592-20.645 4.592-6.115 9.182-23.699 29.843-29.053 35.964-5.352 6.122-10.704 6.888-19.879 2.296-9.176-4.591-38.74-14.277-73.786-45.526-27.275-24.319-45.691-54.359-51.043-63.543-5.352-9.183-.569-14.146 4.024-18.72 4.127-4.109 9.175-10.713 13.763-16.069 4.587-5.355 6.117-9.183 9.175-15.304 3.059-6.122 1.529-11.479-.765-16.07-2.293-4.591-20.644-49.739-28.29-68.104-7.447-17.886-15.013-15.466-20.645-15.747-5.346-.266-11.469-.322-17.585-.322s-16.057 2.295-24.467 11.478-32.113 31.374-32.113 76.521c0 45.147 32.877 88.764 37.465 94.885 4.588 6.122 64.699 98.771 156.741 138.502 21.892 9.45 38.982 15.094 52.308 19.322 21.98 6.979 41.982 5.995 57.793 3.634 17.628-2.633 54.284-22.189 61.932-43.615 7.646-21.427 7.646-39.791 5.352-43.617-2.294-3.826-8.41-6.122-17.585-10.714z"/> </g> </svg></div> </div> </div> <span class="ht_ctc_chat_data" data-no_number="" data-settings="{"number":"15414237793","pre_filled":"Hi","dis_m":"show","dis_d":"show","css":"display: none; cursor: pointer; z-index: 99999999;","pos_d":"position: fixed; bottom: 15px; right: 15px;","pos_m":"position: fixed; bottom: 15px; right: 15px;","schedule":"no","se":150,"ani":"no-animations","url_target_d":"_blank","ga":"yes","fb":"yes","g_init":"default","g_an_event_name":"chat: {number}","pixel_event_name":"Click to Chat by HoliThemes"}" ></span> <script type="application/ld+json">{"@context":"https:\/\/schema.org\/","@graph":[{"@context":"https:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"name":"Home","@id":"https:\/\/codingprolab.com"}},{"@type":"ListItem","position":2,"item":{"name":"Intro. to Network Programming","@id":"https:\/\/codingprolab.com\/product-category\/intro-to-network-programming\/"}},{"@type":"ListItem","position":3,"item":{"name":"Intro. to Network Programming Homework 3 &#8211; Bulletin Board System: Part 3","@id":"https:\/\/codingprolab.com\/assignment\/intro-to-network-programming-homework-3-bulletin-board-system-part-3\/"}}]},{"@context":"https:\/\/schema.org\/","@type":"Product","@id":"https:\/\/codingprolab.com\/assignment\/intro-to-network-programming-homework-3-bulletin-board-system-part-3\/#product","name":"Intro. to Network Programming Homework 3 - Bulletin Board System: Part 3","url":"https:\/\/codingprolab.com\/assignment\/intro-to-network-programming-homework-3-bulletin-board-system-part-3\/","description":"Description\r\nIn this part, you are going to write a client program for BBS service. However, in this part, the content of the\r\npost will store on the client-side (Amazon S3) instead of the server-side. Take the post function of the BBS service,\r\nfor example. The server in this part only stores the metadata of posts (e.g., post id, post title, author and date.)\r\nexcept for the content of the post. That is to say, each client has its storage to store the content of their posts,\r\nand we use Amazon S3 for the storage service. Besides, you are also going to implement new features such as a\r\nsimple mail service.\r\nSystem Architecture\r\nThe server here only stores user information, boards and some metadata of posts. (e.g., post id, post title,\r\netc). The real content of the post will store on the client-side (Amazon S3). Each bucket of Amazon S3\r\nrepresents the storage of each client. So, each client can store the content of its posts in its bucket, and this\r\nbucket is also an incoming mailbox for the mail service of this client. Note that only your client program can\r\nget access to Amazon S3 using Amazon S3 API.\r\nRequirements\r\nThe service can serve at least 10 clients. Your server and client program must be able to handle all commands\r\nin the previous part (output results must be the same as the previous part). For some commands such as\r\nwhoami, exit, logout, create-board, list-board ## and list-post ##, your client\r\nprogram only sends the command to the server and gets the corresponding result from the server. However, there\r\nare some commands that your client program will interact with Amazon S3. These commands are described as\r\nfollows:\r\nCommand format Description Result\r\nregister If successful execution, your client\r\nprogram will create a new bucket in\r\nAmazon S3 for this new user, and your\r\nserver program will store the bucket\r\nname of this new user so that the user\r\nwill be able to log in with its bucket in the\r\nfuture.\r\nIf failed, only print the error message.\r\nSuccess Register successfully.\r\nFail Username is already used.\r\nlogin If successful execution, the user will log\r\nin with its Amazon S3 bucket, so that it\r\ncan manipulate (e.g., upload posts,\r\ndelete posts, etc) its bucket in the future.\r\nIf failed, only print the error message.\r\nSuccess Welcome, .\r\nFail (1) Please logout first.\r\nFail (2) Login failed.\r\ncreate-post --title --\r\ncontent \r\n(command is in the same line )\r\nIf successful execution, the user (client)\r\nwill upload the content of this post to\r\nits S3 bucket using Amazon S3 API,\r\nand the server will keep the metadata of\r\nthis post.\r\nIf failed, only print the error message.\r\nSuccess Create post successfully.\r\nFail (1) Board does not exist.\r\nFail (2) Please login first.\r\nread Show the post whose ID is .\r\nIf successful execution, the client will\r\nget the content of this post from the\r\npost owner\u2019s bucket using Amazon S3\r\nAPI and print the result.\r\nIf failed, only print the error message.\r\nSuccess Author :\r\nTitle :\r\nDate :\r\n--\r\n\r\n--\r\n:\r\nFail Post does not exist.\r\ndelete-post Delete the post whose ID is .\r\nIf successful execution, the user (client)\r\nwill delete this post from its bucket,\r\nand the server will delete the metadata\r\nof this post.\r\nIf failed, only print the error message.\r\nSuccess Delete successfully.\r\nFail (1) Please login first.\r\nFail (2) Post does not exist.\r\nFail (3) Not the post owner.\r\nupdate-post --title\/content Update the post whose ID is .\r\nIf a successful update on the title, the\r\nserver will update the title of this post.\r\nIf a successful update on the content, the\r\nuser (client) will update the content of\r\nthis post in Amazon S3 using Amazon\r\nS3 API.\r\nIf failed, only print the error message.\r\nSuccess Update successfully.\r\nFail (1) Please login first.\r\nFail (2) Post does not exist.\r\nFail (3) Not the post owner.\r\ncomment Add a comment < comment > to the post\r\nwhose ID is .\r\nIf successful execution, the user (client)\r\nwill append the comment to the content\r\nof this post in the post owner\u2019s bucket.\r\nThat is to say, the comment stores in the\r\npost owner\u2019s bucket.\r\nIf failed, only print the error message.\r\nSuccess Comment successfully.\r\nFail (1) Please login first.\r\nFail (2) Post does not exist.\r\nAlso, there are some new commands you have to implement for simple mail service. These commands are\r\ndescribed as follows:\r\nCommand format Description Result\r\nmail-to --subject \r\n--content \r\n(command is in the same line )\r\nSend a mail whose subject is \r\nand content is to user\r\n.\r\nUse --subject and --content to separate\r\nsubject and content.\r\n has the same format as \r\nof the post.\r\n has the same format as\r\n of the post.\r\nIf successful execution, the user (client)\r\nwill create an object with in\r\nuser \u2019s bucket using\r\nAmazon S3 API.\r\nFailed execution:\r\nFail (1): No user logged in.\r\nFail (2): User doesn\u2019t exist.\r\nSuccess Sent successfully.\r\nFail (1) Please login first.\r\nFail (2) does not exist.\r\nlist-mail List all incoming mails of the current\r\nlogged in user.\r\nSuccess:\r\nNote that each user has its mail id\r\nsequence numbers. It should start at\r\n1.\r\nSuccess ID Subject From Date\r\n1 \r\n2 \r\nFail (1) Please login first.\r\n represents the subject of this\r\nmail.\r\n represents that this mail\r\nis sent by user .\r\n represents the sent date of this\r\nmail.\r\nThere is a \\t between each column.\r\nFailed execution:\r\nFail (1): No user logged in.\r\nretr-mail Retrieve the content of the mail \r\nIf successful execution, the user (client)\r\nwill get the content of the mail from its\r\nbucket using Amazon S3 API and print\r\nthe result.\r\n represents the subject of this\r\nmail.\r\n represents that this mail\r\nis sent by user .\r\n represents the sent date of this\r\nmail.\r\nThere is a \\t before \u2018:\u2019.\r\nFailed execution:\r\nFail (1): No user logged in.\r\nFail (2): Mail is not in your\r\nmailbox.\r\nSuccess Subject :\r\nFrom :\r\nDate :\r\n--\r\n\r\nFail (1) Please login first.\r\nFail (2) No such mail.\r\ndelete-mail Delete mail from your mailbox.\r\nIf successful execution, the user (client)\r\nwill delete the content of the mail from\r\nits bucket using Amazon S3 API.\r\nFailed execution:\r\nFail (1): No user logged in.\r\nFail (2): Mail is not in your\r\nmailbox.\r\nSuccess Mail deleted.\r\nFail (1) Please login first.\r\nFail (2) No such mail.\r\nScenario\r\nRun your server first, and run your client program to connect to your server. If the line only shows \u201c% \u201c, that means\r\nwe type in our client program. It is just for the height alignment of two columns here. You can ignore that.\r\nThe sample outputs of the client program are listed as follows:\r\nTerminal output Description and Amazon S3 Console State\r\nStart with nothing in your Amazon S3.\r\nbash$ .\/client 127.0.0.1 7890\r\n********************************\r\n** Welcome to the BBS server. **\r\n********************************\r\n% register Brad bb@cs.nctu.edu.tw 12345\r\nRegister successfully.\r\n%\r\nCreate a bucket for user Brad. You can name the bucket name\r\nof each user by yourself, but there are some limitations of the\r\nbucket name. Please refer to the Note part.\r\n% register Brad bb@cs.nctu.edu.tw 12345\r\nUsername is already used.\r\nJust print the error message. Nothing changes in Amazon S3.\r\n% register V v@cs.nctu.edu.tw bt21\r\nRegister successfully.\r\n%\r\n%\r\n%\r\n%\r\nCreate a bucket for user V.\r\n% login Brad 12345\r\nWelcome, Brad.\r\nThe client program will log in with Brad\u2019s bucket.\r\n% whoami\r\nBrad\r\nNothing changes in Amazon S3.\r\n% create-board NP_HW\r\nCreate board successfully.\r\nNothing changes in Amazon S3.\r\n% create-board NP_HW\r\nBoard already exist.\r\nNothing changes in Amazon S3.\r\n% list-board\r\n Index Name Moderator\r\n 1 NP_HW Brad\r\n%\r\n%\r\nNothing changes in Amazon S3.\r\n% list-board ##HW\r\n Index Name Moderator\r\n 1 NP_HW Brad\r\nNothing changes in Amazon S3.\r\n% create-post NP_HW --title NP_HW3 --content Err...Ha!\r\nCreate post successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\nCreate an object to store the content of this post in Brad\u2019s\r\nbucket. By the way, you can name the object by yourself, but\r\nthere are some restrictions for object naming. Please refer to\r\nthe Note part.\r\n% create-post NCTU --title NP_HW3 --content Uh...\r\nBoard does not exist.\r\nNothing changes in Amazon S3.\r\n% create-post NP_HW --title NP_HW4 --content Wow...\r\nCreate post successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\nCreate a new post.\r\n% list-post NP\r\nBoard does not exist.\r\n%\r\n%\r\nNothing changes in Amazon S3.\r\n% list-post NP_HW\r\n ID Title Author Date\r\n 1 NP_HW3 Brad 04\/14\r\n 2 NP_HW4 Brad 04\/14\r\nNothing changes in Amazon S3.\r\n% list-post NP_HW ##HW3\r\n ID Title Author Date\r\n 1 NP_HW3 Brad 04\/14\r\nNothing changes in Amazon S3.\r\n% read 888\r\nPost does not exist.\r\n%\r\n%\r\n%\r\nNothing changes in Amazon S3.\r\n% read 1\r\n Author :Brad\r\n Title :NP_HW3\r\n Date :2020-04-14\r\n --\r\n Err...\r\n Ha!\r\n --\r\nGet the content of post 1 from the post owner\u2019s bucket.\r\n% update-post 888 --title NP HW_4\r\nPost does not exist.\r\nNothing changes in Amazon S3.\r\n% update-post 1 --title NP HW_4\r\nUpdate successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\nThe state of Amazon S3 may be unchanged. It depends on your\r\ndesign. But for my design, I changed the object key of that post.\r\n% read 1\r\n Author :Brad\r\n Title :NP HW_4\r\n Date :2020-04-14\r\n --\r\n Err...\r\n Ha!\r\n --\r\nGet the content of post 1 from the post owner\u2019s bucket.\r\n% update-post 1 --content Yeah!\r\nUpdate successfully.\r\nUpdate the content of this post in Amazon S3.\r\n% read 1\r\n Author :Brad\r\n Title :NP HW_4\r\n Date :2020-04-14\r\n --\r\n Yeah!\r\n --\r\nGet the content of post 1 from the post owner\u2019s bucket.\r\n% logout\r\nBye, Brad.\r\nNothing changes in Amazon S3.\r\n% whoami Nothing changes in Amazon S3.\r\nPlease login first.\r\n% logout\r\nPlease login first.\r\nNothing changes in Amazon S3.\r\n% login V bt21\r\nWelcome, V.\r\nThe client program will login with V\u2019s bucket.\r\n% create-post NP_HW --title Hello --content I amV.\r\nCreate post successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n% update-post 1 --content Ha!ha!\r\nNot the post owner.\r\nNothing changes in Amazon S3.\r\n% delete-post 1\r\nNot the post owner.\r\nNothing changes in Amazon S3.\r\n% comment 888 Ha ha!\r\nPost does not exist.\r\nNothing changes in Amazon S3.\r\n% comment 1 Ha ha!\r\nComment successfully.\r\n%\r\nThe client program will append the comment to the\r\ncorresponding post object (e.g., NP_HW_4-\r\n1586850747968524907 object in Brad\u2019s bucket) in Amazon S3.\r\n% read 1\r\n Author :Brad\r\n Title :NP HW_4\r\n Date :2020-04-14\r\n --\r\n Yeah!\r\n --\r\n V:Ha ha!\r\nGet the content of post 1 from the post owner\u2019s bucket.\r\n% mail-to TT --subject Hi TT --content Hi TT!\r\nTT does not exist.\r\nNothing changes in Amazon S3.\r\n% mail-to Brad --subject Hi Brad --content Hi Brad!\r\nSent successfully.\r\n% mail-to Brad --subject Hey --content Hey Brad!\r\nSent successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\nUser V creates two email objects in Brad\u2019s bucket.\r\n% list-mail\r\n ID Subject From Date\r\nNothing changes in Amazon S3.\r\n% delete-mail 1\r\nNo such mail.\r\nNothing changes in Amazon S3.\r\n% retr-mail 1\r\nNo such mail.\r\nNothing changes in Amazon S3.\r\n% logout\r\nBye, V.\r\nNothing changes in Amazon S3.\r\n% login Brad 12345\r\nWelcome, Brad.\r\nThe client program will login with Brad\u2019s bucket.\r\n% list-mail\r\n ID Subject From Date\r\n 1 Hi Brad V 04\/14\r\n 2 Hey V 04\/14\r\nNothing changes in Amazon S3.\r\n% retr-mail 1\r\n Subject :Hi Brad\r\n From :V\r\n Date :2020-04-14\r\n --\r\n Hi\r\n Brad!\r\nGet the content of the mail from his bucket.\r\n% mail-to V --subject Hi V --content WoW V!\r\nSent successfully.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\nUser Brad creates a mail object in V\u2019s bucket.\r\n% logout\r\nBye, Brad.\r\nNothing changes in Amazon S3.\r\n% login V bt21\r\nWelcome, V.\r\nThe client program will login with V\u2019s bucket.\r\n% list-mail\r\n ID Subject From Date\r\n 1 Hi V Brad 04\/14\r\nNothing changes in Amazon S3. But note that user V has its\r\nmail id sequence number. It starts at 1.\r\n% logout\r\nBye, V.\r\nNothing changes in Amazon S3.\r\n% login Brad 12345\r\nWelcome, Brad.\r\nThe client program will login with Brad\u2019s bucket.\r\n% list-mail\r\n ID Subject From Date\r\n 1 Hi Brad V 04\/14\r\n 2 Hey V 04\/14\r\nNothing changes in Amazon S3.\r\n% delete-mail 1\r\nMail deleted.\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\n%\r\nUser Brad deletes the object corresponding to his mail 1 from\r\nhis bucket.\r\n% list-mail\r\n ID Subject From Date\r\n 1 Hey V 04\/14\r\nNothing changes in Amazon S3. But note that ID of the mail with\r\nthe subject \u201cHey\u201d is 1.\r\n% logout\r\nBye, Brad.\r\nNothing changes in Amazon S3.\r\n% exit Nothing changes in Amazon S3.\r\nNote\r\n1. About bucket naming:\r\n\u2022 Bucket names must be unique across all existing bucket names in Amazon S3.\r\n\u2022 Bucket names must be at least 3 and no more than 63 characters long.\r\n\u2022 Bucket names must not contain uppercase characters or underscores.\r\n\u2022 Bucket names must start with a lowercase letter or number.\r\n2. About object key name:\r\n\u2022 Unique identifier within a bucket. If you upload the same key name object without versioning-enabled, it will\r\noverwrite the original one.\r\n\u2022 The following character sets are generally safe for use in key names.\r\nFor more details about buckets and objects, you can refer to reference [5][6]\r\n3. About AWS API access key:\r\nIf you want to use AWS SDK to make Amazon S3 API calls, you have to provide your AWS credential first.\r\nHow to set up authentication credential:\r\nCreate a credential file at ~\/.aws\/credentials. The content of this file is described as follows:\r\n[default]\r\naws_access_key_id=\r\naws_secret_access_key=\r\naws_session_token=\r\nYou can get these key from your AWS Educate account. Log in your account and go to Intro. to Network\r\nProgramming classroom. Then, you will see the following page.\r\nClick Account Details\r\nClick Show and copy those keys into ~\/.aws\/credentials\r\nThe credential we use here is temporary, so you have to copy and paste again when the credential\r\nexpiration.\r\n4. About C++ AWS SDK:\r\nTo use the AWS SDK for C++, you need:\r\n\u26ab Visual Studio 2015 or later\r\n\u26ab or GNU Compiler Collection (GCC) 4.9 or later\r\n\u26ab or Clang 3.3 or later\r\n\u26ab A minimum of 4 GB of RAM\r\nSo, if you currently use Amazon EC2 with instance type of t2.micro, please change to at least t2.medium.\r\nMoreover, please backup all your environment when you are running out of classroom credits. We suggest\r\nyou write a script to set up your environment. It will save a lot of time.\r\nHow to change instance type:\r\nRight-click your original instance -> Instance Settings -> Change Instance Type\r\n5. You can use any code examples in the Amazon S3 API documentation to manipulate your Amazon\r\nS3.\r\nGrade (100%)\r\nFor those commands that interact with Amazon S3, we will check your Amazon S3 console. If the state of\r\nyour Amazon S3 is wrong, we will deduct some scores of that command.\r\n\u26ab register command \u2013 (8%)\r\n\u26ab login command \u2013 (8%)\r\n\u26ab create-post command \u2013 (8%)\r\n\u26ab read command \u2013 (8%)\r\n\u26ab delete-post command \u2013 (8%)\r\n\u26ab update-post command \u2013 (8%)\r\n\u26ab comment command \u2013 (8%)\r\n\u26ab mail-to command \u2013 (8%)\r\n\u26ab list-mail command \u2013 (8%)\r\n\u26ab retr-mail command \u2013 (8%)\r\n\u26ab delete-mail command \u2013 (8%)\r\n\u26ab list-post command \u2013 (5%)\r\n\u26ab logout command \u2013 (2%)\r\n\u26ab exit command \u2013 (2%)\r\n\u26ab whoami command \u2013 (1%)\r\n\u26ab create-board command \u2013 (1%)\r\n\u26ab list-board command \u2013 (1%)\r\nSubmission\r\nPlease upload a zip file called \u201chw3_{$student_id}.zip\u201d (e.g., hw3_0856020.zip) that includes your source code. It\r\nmust include at least your server source code and client source code. Submission that doesn\u2019t follow the rule\r\nwill get 20% punishment on the grade.\r\nYou will get 0 points on this project for plagiarism. Please don\u2019t copy-paste other students\u2019 code!\r\nReference\r\n1. C\/C++ Socket\r\n2. SQLite C\/C++ Interface\r\n3. Linux socket SELECT\r\n4. AWS SDK supported languages\r\n5. Bucket Restrictions and Limitations\r\n6. Object Key and Metadata\r\n7. AWS Command Line Interface\r\n8. AWS SDK for C++\r\n9. AWS SDK for Python\r\n10. Sequence diagram reference","image":"https:\/\/codingprolab.com\/wp-content\/uploads\/2020\/10\/download-1.jpg","sku":13445,"offers":[{"@type":"Offer","priceSpecification":[{"@type":"UnitPriceSpecification","price":"35.00","priceCurrency":"USD","valueAddedTaxIncluded":false,"validThrough":"2026-12-31"}],"priceValidUntil":"2026-12-31","availability":"http:\/\/schema.org\/InStock","url":"https:\/\/codingprolab.com\/assignment\/intro-to-network-programming-homework-3-bulletin-board-system-part-3\/","seller":{"@type":"Organization","name":"CodingProlab","url":"https:\/\/codingprolab.com"}}]}]}</script> <input type="hidden" id="njt_nofi_checkDisplayReview" name="njt_nofi_checkDisplayReview" value='{"is_home":false,"is_page":false,"is_single":true,"id_page":13445}'> <div class="pswp" tabindex="-1" role="dialog" aria-modal="true" aria-hidden="true"> <div class="pswp__bg"></div> <div class="pswp__scroll-wrap"> <div class="pswp__container"> <div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div> </div> <div class="pswp__ui pswp__ui--hidden"> <div class="pswp__top-bar"> <div class="pswp__counter"></div> <button class="pswp__button pswp__button--zoom" aria-label="Zoom in/out"></button> <button class="pswp__button pswp__button--fs" aria-label="Toggle fullscreen"></button> <button class="pswp__button pswp__button--share" aria-label="Share"></button> <button class="pswp__button pswp__button--close" aria-label="Close (Esc)"></button> <div class="pswp__preloader"> <div class="pswp__preloader__icn"> <div class="pswp__preloader__cut"> <div class="pswp__preloader__donut"></div> </div> </div> </div> </div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> <div class="pswp__share-tooltip"></div> </div> <button class="pswp__button pswp__button--arrow--left" aria-label="Previous (arrow left)"></button> <button class="pswp__button pswp__button--arrow--right" aria-label="Next (arrow right)"></button> <div class="pswp__caption"> <div class="pswp__caption__center"></div> </div> </div> </div> </div> <script> (function () { var c = document.body.className; c = c.replace(/woocommerce-no-js/, 'woocommerce-js'); document.body.className = c; })(); </script> <link rel='stylesheet' id='wc-blocks-style-css' href='https://codingprolab.com/wp-content/plugins/woocommerce/assets/client/blocks/wc-blocks.css?ver=wc-9.6.0' media='all' /> <style id='jetpack-block-rating-star-inline-css'> .wp-block-jetpack-rating-star{line-height:0;margin-bottom:1.5em;stroke-width:0}.wp-block-jetpack-rating-star .is-rating-unfilled{fill-opacity:.33}.wp-block-jetpack-rating-star .jetpack-ratings-button{border-radius:2px;display:inline-flex}.wp-block-jetpack-rating-star .jetpack-ratings-button:focus{box-shadow:0 0 0 1px currentColor;outline:2px solid #0000}.wp-block-jetpack-rating-star>p{border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.wp-block-jetpack-rating-star>span{display:inline-flex!important;margin-inline-end:.3em}.wp-block-jetpack-rating-star .jetpack-ratings-button span,.wp-block-jetpack-rating-star>span span{display:inline-flex;flex-shrink:0;overflow:hidden;width:12px}.wp-block-jetpack-rating-star .jetpack-ratings-button span svg,.wp-block-jetpack-rating-star>span span svg{flex-shrink:0}.wp-block-jetpack-rating-star .jetpack-ratings-button span:nth-child(2n),.wp-block-jetpack-rating-star>span span:nth-child(2n){justify-content:flex-end}.wp-block-jetpack-rating-star svg{display:inline-block!important;max-width:none!important}.wp-block-jetpack-rating-star.is-style-outlined{stroke-width:2px}.wp-block-jetpack-rating-star.is-style-outlined .is-rating-unfilled{fill:#0000}.wp-block-jetpack-rating-star .jetpack-ratings-button{margin-inline-end:.3em} </style> <script id="ht_ctc_app_js-js-extra"> var ht_ctc_chat_var = {"number":"15414237793","pre_filled":"Hi","dis_m":"show","dis_d":"show","css":"display: none; cursor: pointer; z-index: 99999999;","pos_d":"position: fixed; bottom: 15px; right: 15px;","pos_m":"position: fixed; bottom: 15px; right: 15px;","schedule":"no","se":"150","ani":"no-animations","url_target_d":"_blank","ga":"yes","fb":"yes","g_init":"default","g_an_event_name":"chat: {number}","pixel_event_name":"Click to Chat by HoliThemes"}; var ht_ctc_variables = {"g_an_event_name":"chat: {number}","pixel_event_type":"trackCustom","pixel_event_name":"Click to Chat by HoliThemes","g_an_params":["g_an_param_1","g_an_param_2","g_an_param_3"],"g_an_param_1":{"key":"number","value":"{number}"},"g_an_param_2":{"key":"title","value":"{title}"},"g_an_param_3":{"key":"url","value":"{url}"},"pixel_params":["pixel_param_1","pixel_param_2","pixel_param_3","pixel_param_4"],"pixel_param_1":{"key":"Category","value":"Click to Chat for WhatsApp"},"pixel_param_2":{"key":"ID","value":"{number}"},"pixel_param_3":{"key":"Title","value":"{title}"},"pixel_param_4":{"key":"URL","value":"{url}"}}; </script> <script src="https://codingprolab.com/wp-content/plugins/click-to-chat-for-whatsapp/new/inc/assets/js/app.js?ver=4.16" id="ht_ctc_app_js-js"></script> <script src="https://codingprolab.com/wp-includes/js/dist/hooks.min.js?ver=4d63a3d491d11ffd8ac6" id="wp-hooks-js"></script> <script src="https://codingprolab.com/wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6" id="wp-i18n-js"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script src="https://codingprolab.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.0.3" id="swv-js"></script> <script id="contact-form-7-js-before"> var wpcf7 = { "api": { "root": "https:\/\/codingprolab.com\/wp-json\/", "namespace": "contact-form-7\/v1" } }; </script> <script src="https://codingprolab.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.0.3" id="contact-form-7-js"></script> <script id="kk-star-ratings-js-extra"> var kk_star_ratings = {"action":"kk-star-ratings","endpoint":"https:\/\/codingprolab.com\/wp-admin\/admin-ajax.php","nonce":"e4db4ea77d"}; </script> <script src="https://codingprolab.com/wp-content/plugins/kk-star-ratings/src/core/public/js/kk-star-ratings.min.js?ver=5.4.10.2" id="kk-star-ratings-js"></script> <script src="https://codingprolab.com/wp-content/plugins/pinterest-pin-it-button-on-image-hover-and-post/js/main.js?ver=6.7.1" id="wl-pin-main-js"></script> <script id="wl-pin-main-js-after"> jQuery(document).ready(function(){jQuery(".is-cropped img").each(function(){jQuery(this).attr("style", "min-height: 120px;min-width: 100px;");});jQuery(".avatar").attr("style", "min-width: unset; min-height: unset;");}); </script> <script id="awdr-main-js-extra"> var awdr_params = {"ajaxurl":"https:\/\/codingprolab.com\/wp-admin\/admin-ajax.php","nonce":"43f23e1daf","enable_update_price_with_qty":"show_when_matched","refresh_order_review":"0","custom_target_simple_product":"","custom_target_variable_product":"","js_init_trigger":"","awdr_opacity_to_bulk_table":"","awdr_dynamic_bulk_table_status":"0","awdr_dynamic_bulk_table_off":"on","custom_simple_product_id_selector":"","custom_variable_product_id_selector":""}; </script> <script src="https://codingprolab.com/wp-content/plugins/woo-discount-rules/v2/Assets/Js/site_main.js?ver=2.6.6" id="awdr-main-js"></script> <script src="https://codingprolab.com/wp-content/plugins/woo-discount-rules/v2/Assets/Js/awdr-dynamic-price.js?ver=2.6.6" id="awdr-dynamic-price-js"></script> <script id="wp-statistics-tracker-js-extra"> var WP_Statistics_Tracker_Object = {"requestUrl":"https:\/\/codingprolab.com\/wp-json\/wp-statistics\/v2","ajaxUrl":"https:\/\/codingprolab.com\/wp-admin\/admin-ajax.php","hitParams":{"wp_statistics_hit":1,"source_type":"product","source_id":13445,"search_query":"","signature":"916c78b61ff7821cddeeb3fb9cfbbba8","endpoint":"hit"},"onlineParams":{"wp_statistics_hit":1,"source_type":"product","source_id":13445,"search_query":"","signature":"916c78b61ff7821cddeeb3fb9cfbbba8","endpoint":"online"},"option":{"userOnline":"1","consentLevel":"","dntEnabled":"1","bypassAdBlockers":"","isWpConsentApiActive":false,"trackAnonymously":false,"isPreview":false},"jsCheckTime":"60000"}; </script> <script src="https://codingprolab.com/wp-content/plugins/wp-statistics/assets/js/tracker.js?ver=14.12.2" id="wp-statistics-tracker-js"></script> <script id="storefront-navigation-js-extra"> var storefrontScreenReaderText = {"expand":"Expand child menu","collapse":"Collapse child menu"}; </script> <script src="https://codingprolab.com/wp-content/themes/storefront/assets/js/navigation.min.js?ver=4.5.3" id="storefront-navigation-js"></script> <script src="https://codingprolab.com/wp-content/plugins/woocommerce/assets/js/sourcebuster/sourcebuster.min.js?ver=9.6.0" id="sourcebuster-js-js"></script> <script id="wc-order-attribution-js-extra"> var wc_order_attribution = {"params":{"lifetime":1.0e-5,"session":30,"base64":false,"ajaxurl":"https:\/\/codingprolab.com\/wp-admin\/admin-ajax.php","prefix":"wc_order_attribution_","allowTracking":true},"fields":{"source_type":"current.typ","referrer":"current_add.rf","utm_campaign":"current.cmp","utm_source":"current.src","utm_medium":"current.mdm","utm_content":"current.cnt","utm_id":"current.id","utm_term":"current.trm","utm_source_platform":"current.plt","utm_creative_format":"current.fmt","utm_marketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}}; </script> <script src="https://codingprolab.com/wp-content/plugins/woocommerce/assets/js/frontend/order-attribution.min.js?ver=9.6.0" id="wc-order-attribution-js"></script> <script src="https://codingprolab.com/wp-content/themes/storefront/assets/js/woocommerce/header-cart.min.js?ver=4.5.3" id="storefront-header-cart-js"></script> <script src="https://codingprolab.com/wp-content/themes/storefront/assets/js/footer.min.js?ver=4.5.3" id="storefront-handheld-footer-bar-js"></script> <script src="https://codingprolab.com/wp-content/plugins/easy-remove-footer-credit/script.js?ver=6.7.1" id="jaberfc_script-js"></script> <script src="https://codingprolab.com/wp-content/themes/storefront/assets/js/woocommerce/extensions/brands.min.js?ver=4.5.3" id="storefront-woocommerce-brands-js"></script> <script src="https://stats.wp.com/e-202506.js" id="jetpack-stats-js" data-wp-strategy="defer"></script> <script id="jetpack-stats-js-after"> _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"184407608\",\"post\":\"13445\",\"tz\":\"0\",\"srv\":\"codingprolab.com\",\"j\":\"1:14.2.1\"}") ]); _stq.push([ "clickTrackerInit", "184407608", "13445" ]); </script> <script id="jetpack-blocks-assets-base-url-js-before"> var Jetpack_Block_Assets_Base_Url="https://codingprolab.com/wp-content/plugins/jetpack/_inc/blocks/"; </script> <script src="https://codingprolab.com/wp-content/plugins/jetpack/_inc/blocks/rating-star/view.js?minify=false&ver=14.2.1" id="jetpack-block-rating-star-js"></script> <script id="storefront-sticky-add-to-cart-js-extra"> var storefront_sticky_add_to_cart_params = {"trigger_class":"entry-summary"}; </script> <script src="https://codingprolab.com/wp-content/themes/storefront/assets/js/sticky-add-to-cart.min.js?ver=4.5.3" id="storefront-sticky-add-to-cart-js"></script> <!-- WooCommerce JavaScript --> <script type="text/javascript"> jQuery(function($) { _wca.push({'_en': 'woocommerceanalytics_product_view','session_id': '', 'blog_id': '184407608', 'store_id': 'cbeea31a-5930-4235-891b-77c162abcb91', 'ui': '', 'url': 'https://codingprolab.com', 'landing_page': '', 'woo_version': '9.6.0', 'wp_version': '6.7.1', 'store_admin': '0', 'device': 'desktop', 'template_used': '0', 'additional_blocks_on_cart_page': [],'additional_blocks_on_checkout_page': [],'store_currency': 'USD', 'timezone': '+00:00', 'is_guest': '1', 'order_value': '0', 'order_total': '0', 'total_tax': '0.00', 'total_discount': '0', 'total_shipping': '0', 'products_count': '0', 'cart_page_contains_cart_block': '0', 'cart_page_contains_cart_shortcode': '1', 'checkout_page_contains_checkout_block': '0', 'checkout_page_contains_checkout_shortcode': '1', 'pi': '13445', 'pn': 'Intro. to Network Programming Homework 3 - Bulletin Board System: Part 3', 'pc': 'Intro. to Network Programming', 'pp': '35', 'pt': 'simple', }); }); </script> </body> </html>