代写网络编程作业、代写Sockets Programming using C

代写网络编程作业、代写Sockets Programming using C
Sockets Programming using C
Overview
? This homework is due by 11:59:59 PM on Monday, April 24, 2017.
? This homework will count as 9% of your final course grade.
? This homework is to be completed individually. Do not share your code with anyone else.
? Your code must successfully compile and run on Submitty, which uses Ubuntu v14.04.5 LTS.
? You must use C for this homework assignment, and your code must successfully compile
via gcc with absolutely no warning messages when the -Wall (i.e., warn all) compiler option
is used. We will also use -Werror, which will treat all warnings as critical errors.
? Note that the gcc compiler is version 4.8.5 (Ubuntu 4.8.5-2ubuntu1~14.04.1).
Homework Specifications
In this final homework assignment, you will use C to write server code to implement a data storage
server using server sockets.
For your server, clients connect to your server via TCP or UDP. For TCP, clients connect via a
specific TCP port number (i.e., the listener port); this TCP port number is the first command-line
argument to your server. For UDP, clients send datagram(s) to a specific UDP port number; this
UDP port number is the second command-line argument to your server.
Your server must not be a single-threaded iterative server. Instead, your server must use either
multiple threads or multiple child processes. Further, to support both TCP and UDP at the
same time, you must use the select() system call to detect incoming TCP connections and UDP
datagrams.
As with previous assignments, your server must also be parallelized to the extent possible. As such,
be sure you handle all potential synchronization issues.
Note that your server must support clients implemented in any language (e.g., Java, C, Python,
etc.); therefore, be sure to handle only streams of bytes as opposed to specific language-specific
structures.
And though you will only submit your server code for this assignment, feel free to create one or
more test clients. Test clients will not be provided, but you may share test clients with others via
Piazza. Also note that you can use netcat (or nc) to test your server.
Application-Layer Protocol
The application-layer protocol between client and server is a line-based protocol (see the next page).
Streams of bytes (i.e., characters) are transmitted between clients and your server.
The specifics of the application-layer protocol depend on whether clients use TCP or UDP. For
TCP, clients connect to the server and can add and read files; clients can also request a list of files
available on the server.
Since UDP is connectionless, UDP clients are only able to request a list of files available on the
server.
For TCP, once a client is connected, your server must handle as many client commands as necessary,
closing the socket connection only when it detects that the remote client has closed its socket. This
is not the case in UDP since UDP is connectionless.
For both TCP and UDP, a dedicated child process or child thread must handle the TCP connection
or UDP datagram.
All regular files must be supported, meaning that both text and binary (e.g., image) files must be
supported. To achieve this, be sure you do not assume that files contain strings; in other words,
do not use string functions that rely on the '\0' character. Instead, rely on byte counts.
Files must be stored in a directory called storage. As your server starts up, check to be sure this
directory exists; if it does not, report an error to stderr and exit. In general, your server can either
keep track of stored files via a (shared) structure or use system calls to check for the existence of
stored files. Note that you will have synchronization issues to resolve here (e.g., what happens
when a client attempts to read a file as it is being written by another client?).
On Submitty, you can assume that the storage directory is initially empty.
Finally, subdirectories are not to be supported. A filename is simply a valid filename without
any relative or absolute path specified. More specifically, we will test using files containing only
alphanumeric and '.' characters; you may assume that a filename starts with an alpha character.
2
The application-layer protocol must be implemented exactly as shown below:
SAVE <filename> <bytes>\n<file-contents>
-- only allowed over TCP
-- save file <filename> on the storage server
-- if <filename> is invalid or <bytes> is zero or invalid,
return "ERROR INVALID REQUEST\n"
-- if the file already exists, return "ERROR FILE EXISTS\n"
-- return "ACK\n" if successful
READ <filename> <byte-offset> <length>\n
-- only allowed over TCP
-- server returns <length> bytes of the contents of file <filename>,
starting at <byte-offset>
-- if <filename> is invalid or <length> is zero or invalid,
return "ERROR INVALID REQUEST\n"
-- if the file does not exist, return "ERROR NO SUCH FILE\n"
-- if the file byte range is invalid, return "ERROR INVALID BYTE RANGE\n"
-- return an acknowledgement if successful; use the format below:
ACK <bytes>\n<file-excerpt>
LIST\n
-- allowed over TCP and UDP
-- server returns a list of files currently stored on the server
-- the list must be sent in alphabetical order (case-sensitive)
-- the format of the message containing the list of files is as follows:
<number-of-files> <filename1> <filename2> ... <filenameN>\n
-- therefore, if no files are stored, "0\n" is returned
For any other error messages, use a short human-readable description matching the format shown
below. Expect clients to display these error descriptions to users.
ERROR <error-description>\n
Note that all commands are case-sensitive, i.e., match the above specifications exactly. Make sure
that invalid commands received by the server do not crash the server. In general, return an error
and an error description if something is incorrect or goes wrong.
You can assume that the correct number of bytes will be sent and received by client and server. In
practice, this is not a safe assumption, but it should greatly simplify your implementation.
Be very careful to stick to the protocol or else your server might not work with all clients (and with
all tests we use for grading).
3
Output Requirements
Your server is required to output one or more lines describing each command that it executes.
Required output is illustrated in the example below. The child IDs shown in the example are
either thread IDs or process IDs. And as per usual, output lines may be interleaved.
bash$ ./a.out 9876 9889
Started server
Listening for TCP connections on port: 9876
Listening for UDP datagrams on port: 9889
Rcvd incoming TCP connection from: <client-hostname-or-IP>
[child 13455] Received SAVE abc.txt 25842
[child 13455] Stored file "abc.txt" (25842 bytes)
[child 13455] Sent ACK
[child 13455] Received READ xyz.jpg 5555 2000
[child 13455] Sent ERROR NO SUCH FILE
[child 13455] Client disconnected
...
Rcvd incoming TCP connection from: <client-hostname-or-IP>
[child 11938] Received SAVE def.txt 79112
[child 11938] Stored file "def.txt" (79112 bytes)
[child 11938] Sent ACK
[child 11938] Client disconnected
...
Rcvd incoming UDP datagram from: <client-hostname-or-IP>
[child 17732] Received LIST
[child 17732] Sent 2 abc.txt def.txt
...
Rcvd incoming TCP connection from: <client-hostname-or-IP>
[child 19232] Received READ abc.txt 4090 5000
[child 19232] Sent ACK 5000
[child 19232] Sent 5000 bytes of "abc.txt" from offset 4090
[child 19232] Received LIST
[child 19232] Sent 2 abc.txt def.txt
[child 19232] Client disconnected
...
Submission Instructions
To submit your assignment (and also perform final testing of your code), please use Submitty. The
URL is on the course website.
Be sure you submit only your server code (i.e., do not submit any client code).
http://www.6daixie.com/contents/13/1306.html

本团队核心人员组成主要包括硅谷工程师、BAT一线工程师,国内Top5硕士、博士生,精通德英语!我们主要业务范围是代做编程大作业、课程设计等等。

我们的方向领域:window编程 数值算法 AI人工智能 金融统计 计量分析 大数据 网络编程 WEB编程 通讯编程 游戏编程多媒体linux 外挂编程 程序API图像处理 嵌入式/单片机 数据库编程 控制台 进程与线程 网络安全  汇编语言 硬件编程 软件设计 工程标准规等。其中代写代做编程语言或工具包括但不限于以下范围:

C/C++/C#代写

Java代写

IT代写

Python代写

辅导编程作业

Matlab代写

Haskell代写

Processing代写

Linux环境搭建

Rust代写

Data Structure Assginment 数据结构代写

MIPS代写

Machine Learning 作业 代写

Oracle/SQL/PostgreSQL/Pig 数据库代写/代做/辅导

Web开发、网站开发、网站作业

ASP.NET网站开发

Finance Insurace Statistics统计、回归、迭代

Prolog代写

Computer Computational method代做

因为专业,所以值得信赖。如有需要,请加QQ:99515681 或邮箱:[email protected]

微信:codinghelp

猜你喜欢

转载自www.cnblogs.com/python3years/p/8909684.html