aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-01-20 23:47:53 -0500
committerCara Salter <cara@devcara.com>2022-01-20 23:47:53 -0500
commitc2352ee043546b518f69c615a1ece778e942e650 (patch)
tree6efe18199f0fe2810c879c9251db2897a3244604 /src/server.c
downloadcmud-c2352ee043546b518f69c615a1ece778e942e650.tar.gz
cmud-c2352ee043546b518f69c615a1ece778e942e650.zip
initial commit
yay start of a state machine and also learning sockets
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/server.c b/src/server.c
new file mode 100644
index 0000000..bee6153
--- /dev/null
+++ b/src/server.c
@@ -0,0 +1,84 @@
+#include "server.h"
+#include "login.h"
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int server_listen(server_t *server) {
+ /*
+ **
+ ** The `socket(2)` syscall returns a file descriptor for a socket
+ **
+ ** it takes two arguments that we care about:
+ ** - domain -- AF_INET for IPv4
+ ** - type -- SOCK_STREAM sequenced and reliable
+ **
+ */
+ int err = (server->listen_fd = socket(AF_INET, SOCK_STREAM, 0));
+
+ if (err == -1) {
+ perror("socket");
+ printf("Failed to create socket");
+ return err;
+ }
+
+ struct sockaddr_in server_addr = {0};
+
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ server_addr.sin_port = htons(8000);
+
+ err = bind(server->listen_fd, (struct sockaddr *)&server_addr,
+ sizeof(server_addr));
+ if (err == -1) {
+ perror("bind");
+ printf("Failed to bind socket\n");
+ return err;
+ }
+
+ err = listen(server->listen_fd, 100);
+ if (err == -1) {
+ perror("listen");
+ printf("Failed to listen on socket\n");
+ return err;
+ }
+
+ return 0;
+}
+
+int server_accept(server_t *server) {
+ int err = 0;
+ int conn_fd;
+ socklen_t client_len;
+
+ struct sockaddr_in client_addr;
+
+ client_len = sizeof(client_addr);
+
+ for (;;) {
+ err = (conn_fd = accept(server->listen_fd, (struct sockaddr *)&client_addr,
+ &client_len));
+ if (err == -1) {
+ perror("Accept");
+ printf("failed accepting connection\n");
+ return err;
+ }
+
+ if (!fork()) {
+ handle_player(conn_fd);
+ }
+ }
+
+ return err;
+}
+
+int send_to_fd(int fd, char *msg) {
+ int err = 0;
+
+ err = send(fd, msg, strlen(msg), 0);
+
+ return err;
+}