summaryrefslogtreecommitdiffstats
path: root/03_exercise/srv/server.c
diff options
context:
space:
mode:
Diffstat (limited to '03_exercise/srv/server.c')
-rw-r--r--03_exercise/srv/server.c75
1 files changed, 66 insertions, 9 deletions
diff --git a/03_exercise/srv/server.c b/03_exercise/srv/server.c
index 972b11f..bb2b3ab 100644
--- a/03_exercise/srv/server.c
+++ b/03_exercise/srv/server.c
@@ -1,16 +1,73 @@
#include <stdio.h>
+#include <string.h>
#include <stdlib.h>
+
#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#define PORT 9000
-int main()
-{
- while (1)
- {
- printf("[srv]: idle\n");
- sleep(2);
- }
-
- return 0;
+static inline void die(const char *msg) {
+ perror(msg);
+ exit(-1);
+}
+
+int main() {
+ struct sockaddr_in srv_addr, cli_addr;
+ int sockopt = 1;
+ socklen_t sad_sz = sizeof(struct sockaddr_in);
+ int sfd, cfd;
+ ssize_t bytes;
+ char in_buf[256];
+ char out_buf[256];
+
+ srv_addr.sin_family = AF_INET;
+ srv_addr.sin_port = htons(PORT);
+ srv_addr.sin_addr.s_addr = INADDR_ANY;
+
+ if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ die("Could not open socket");
+
+ setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *) &sockopt, sizeof(sockopt));
+
+ if (bind(sfd, (struct sockaddr *) &srv_addr, sad_sz) < 0)
+ die("Could not bind socket");
+
+ if (listen(sfd, 1) < 0)
+ die("Could not listen on socket");
+
+ cfd = accept(sfd, (struct sockaddr *) &cli_addr, &sad_sz);
+ if (cfd < 0)
+ die("Could not accept incoming connection");
+
+ printf("srv: connected: %s\n", inet_ntoa(cli_addr.sin_addr));
+
+ while ((bytes = read(cfd, in_buf, sizeof(in_buf))) != 0) {
+ if (bytes < 0)
+ die("Couldn't receive message");
+
+ printf("srv: %s\n", in_buf);
+
+ if (strcmp(in_buf, "get") == 0) {
+ // TODO: implement get
+ } else if (strcmp(in_buf, "put") == 0) {
+ // TODO: implement put
+ } else if (strcmp(in_buf, "ping") == 0) {
+ strncpy(out_buf, "pong!", sizeof(out_buf));
+ } else {
+ // TODO: connect our shell implementation
+ strncpy(out_buf, "got: ", sizeof(out_buf));
+ strncpy(out_buf + sizeof("got: "), in_buf, sizeof(out_buf) - sizeof("got: "));
+ }
+
+ if (write(cfd, out_buf, sizeof(out_buf)) < 0)
+ die("Couldn't send message");
+ }
+
+ printf("srv: closing down\n");
+
+ close(cfd);
+ close(sfd);
}