diff options
author | LAN-TW <lantw44@gmail.com> | 2013-10-12 21:22:16 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-10-12 21:26:49 +0800 |
commit | 379af3b399c146eb0da4013c22e92808baebe595 (patch) | |
tree | 77fe454b85fa4d4ac596723bd934bcc33d558fbc | |
parent | abf82cb5f2bbdf34b1edd7ca6408340c5fc9333a (diff) | |
download | sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar.gz sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar.bz2 sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar.lz sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar.xz sp2013-379af3b399c146eb0da4013c22e92808baebe595.tar.zst sp2013-379af3b399c146eb0da4013c22e92808baebe595.zip |
HW1: 加入 request_msg 函式方便印出與 client 相關的記錄訊息
-rw-r--r-- | hw1/main.c | 3 | ||||
-rw-r--r-- | hw1/proc_r.c | 29 | ||||
-rw-r--r-- | hw1/server.c | 11 | ||||
-rw-r--r-- | hw1/server.h | 14 |
4 files changed, 33 insertions, 24 deletions
@@ -40,8 +40,7 @@ int main(int argc, char** argv) { strcpy(requestP[svr.listen_fd].host, svr.hostname); // Loop for handling connections - fprintf(stderr, - "\nstarting on %.80s, port %d, fd %d, maxconn %d...\n", + printf("\nstarting on %.80s, port %d, fd %d, maxfd %d ...\n", svr.hostname, svr.port, svr.listen_fd, maxfd); while (procconn(&svr, requestP, maxfd)); diff --git a/hw1/proc_r.c b/hw1/proc_r.c index 9d7a470..4446d20 100644 --- a/hw1/proc_r.c +++ b/hw1/proc_r.c @@ -44,7 +44,7 @@ bool procconn(server* svr, request* req, int maxfd){ case EMFILE: case ENFILE: fprintf (stderr, "Too many open file ... " - "(maxconn %d)\n", maxfd); + "(maxfd %d)\n", maxfd); continue; default: perror ("accept"); @@ -54,17 +54,13 @@ bool procconn(server* svr, request* req, int maxfd){ req[conn_fd].conn_fd = conn_fd; req[conn_fd].active = true; strcpy(req[conn_fd].host, inet_ntoa(client_addr.sin_addr)); - fprintf(stderr, "Accept a new request: fd %d from %s\n", - conn_fd, req[conn_fd].host); + request_msg (&req[conn_fd], "accepted, waiting for filename"); FD_SET (conn_fd, &(svr->readfds)); } } else { rval = request_read(&req[i]); if (rval <= 0) { - fprintf (stderr, "fd %d from %s: %s%s\n", - i, req[i].host, - rval < 0 ? "socket error: " : "command done", - rval < 0 ? strerror (errno) : ""); + request_msg (&req[i], "socket read: %s", strerror (errno)); request_free (&req[i], svr); } else { if (req[i].header_done) { @@ -84,24 +80,24 @@ bool procconn(server* svr, request* req, int maxfd){ if (req[i].header_done) { if (!req[i].header_accept) { req[i].file_fd = open (req[i].filename, O_RDONLY); - fprintf (stderr, "fd %d from %s: open %s %s%s\n", - i, req[i].host, req[i].filename, + request_msg (&req[i], "open %s%s", req[i].file_fd < 0 ? "error: " : "done", req[i].file_fd < 0 ? strerror(errno) : ""); if (req[i].file_fd < 0) { write (req[i].conn_fd, svr->reject_hdr, SVR_REJECT_HDR_LEN); + request_msg (&req[i], "REJECT sent"); request_free (&req[i], svr); continue; } struct stat file_stat; rval = fstat (req[i].file_fd, &file_stat); - fprintf (stderr, "fd %d from %s: fstat %s %s%s\n", - i, req[i].host, req[i].filename, + request_msg (&req[i], "fstat %s%s", req[i].file_fd < 0 ? "error: " : "done", req[i].file_fd < 0 ? strerror(errno) : ""); if (req[i].file_fd < 0) { write (req[i].conn_fd, svr->reject_hdr, SVR_REJECT_HDR_LEN); + request_msg (&req[i], "REJECT sent"); request_free (&req[i], svr); continue; } @@ -118,15 +114,16 @@ bool procconn(server* svr, request* req, int maxfd){ .l_len = 0 }; rval = fcntl (req[i].file_fd, F_SETLK, &lock_info); - fprintf (stderr, "fd %d from %s: lock %s %s%s\n", - i, req[i].host, req[i].filename, + request_msg (&req[i], "lock %s%s", rval < 0 ? "error: " : "done", rval < 0 ? strerror(errno) : ""); if (rval < 0) { write (req[i].conn_fd, svr->reject_hdr, SVR_REJECT_HDR_LEN); + request_msg (&req[i], "REJECT sent"); request_free (&req[i], svr); continue; } + request_msg (&req[i], "ACCEPT sent"); write (req[i].conn_fd, svr->accept_hdr, SVR_ACCEPT_HDR_LEN); req[i].header_accept = true; } else { @@ -137,12 +134,12 @@ bool procconn(server* svr, request* req, int maxfd){ errno != EAGAIN) { // fatal error, close the connection - perror ("read"); + request_msg (&req[i], "socket read: %s", strerror (errno)); request_free (&req[i], svr); } continue; } else if (rval == 0) { - fprintf (stderr, "%d done\n", req[i].conn_fd); + request_msg (&req[i], "transfer done, closing connection"); request_free (&req[i], svr); continue; } @@ -154,7 +151,7 @@ bool procconn(server* svr, request* req, int maxfd){ rval = write (req[i].conn_fd, req[i].buf + req[i].buf_set, req[i].buf_len); if (rval < 0) { - perror("write"); + request_msg (&req[i], "socket write: %s", strerror (errno)); request_free (&req[i], svr); continue; } diff --git a/hw1/server.c b/hw1/server.c index b8392ba..45f18d1 100644 --- a/hw1/server.c +++ b/hw1/server.c @@ -7,6 +7,7 @@ #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> +#include <stdarg.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> @@ -126,3 +127,13 @@ int request_read(request* reqP) { } return 1; } + +void request_msg (request* reqP, const char* format, ...) { + va_list ap; + va_start (ap, format); + printf ("client %d from %s: %s: ", reqP->conn_fd, reqP->host, + reqP->filename ? reqP->filename : "(no filename)"); + vprintf (format, ap); + putchar ('\n'); + va_end (ap); +} diff --git a/hw1/server.h b/hw1/server.h index fc5bf2a..c9de5e9 100644 --- a/hw1/server.h +++ b/hw1/server.h @@ -44,20 +44,22 @@ typedef struct { extern server svr; // server // initailize a server, exit for error -void server_init(unsigned short port, int maxfd); +void server_init (unsigned short port, int maxfd); // initailize a request instance -void request_init(request* reqP); +void request_init (request* reqP); // free resources used by a request instance -void request_free(request* reqP, server* svr); +void request_free (request* reqP, server* svr); // return 0: socket ended, request done. -// return 1: success, message (without header) got this time is in reqP->buf with reqP->buf_len bytes. read more until got <= 0. -// It's guaranteed that the header would be correctly set after the first read. +// return 1: success, message (without header) got this time is in reqP->buf +// with reqP->buf_len bytes. read more until got <= 0. It's guaranteed that +// the header would be correctly set after the first read. // error code: // -1: client connection error -int request_read(request* reqP); +int request_read (request* reqP); +void request_msg (request* reqP, const char* format, ...); #endif /* SP_HW1_SERVER_H */ |