summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-10-12 21:22:16 +0800
committerLAN-TW <lantw44@gmail.com>2013-10-12 21:26:49 +0800
commit379af3b399c146eb0da4013c22e92808baebe595 (patch)
tree77fe454b85fa4d4ac596723bd934bcc33d558fbc
parentabf82cb5f2bbdf34b1edd7ca6408340c5fc9333a (diff)
downloadsp2013-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.c3
-rw-r--r--hw1/proc_r.c29
-rw-r--r--hw1/server.c11
-rw-r--r--hw1/server.h14
4 files changed, 33 insertions, 24 deletions
diff --git a/hw1/main.c b/hw1/main.c
index 80298ac..9c7ecfd 100644
--- a/hw1/main.c
+++ b/hw1/main.c
@@ -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 */