annotate seobeo/main.c @ 4:0b3b4f5887bb

[Seobeo] Updated so that it create socket for both server and clients.
author June Park <parkjune1995@gmail.com>
date Fri, 26 Sep 2025 15:14:46 -0700
parents 2758f5527d2b
children 3e12bf044589
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 /*
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2 ** server.c -- a stream socket server demo
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3 */
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
5 #include "seobeo/seobeo.h"
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
7 Dowa_PHashMap cache;
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
8
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
9 void SigchildHandler(int s)
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10 {
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
11 (void)s; // quiet unused variable warning
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
12
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
13 // waitpid() might overwrite errno, so we save and restore it:
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
14 int saved_errno = errno;
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16 while(waitpid(-1, NULL, WNOHANG) > 0);
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 errno = saved_errno;
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 }
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
21 void HandleClientRequest(Seobeo_PHandle cli)
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
22 {
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
23 size_t idx = Dowa_HashMap_GetPosition(cache, "index.html");
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
24 Dowa_PHashEntry entry = cache->entries[idx];
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
25
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
26 if (!entry) {
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
27 // 404 response if missing
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
28 const char *not_found =
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
29 "HTTP/1.1 404 Not Found\r\n"
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
30 "Content-Length: 0\r\n"
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
31 "Connection: close\r\n"
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
32 "\r\n";
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
33 send(cli->socket, not_found, strlen(not_found), 0);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
34 Seobeo_Handle_Destroy(cli);
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
35 return;
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
36 }
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
37
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
38 // 3) Prepare header with the correct content‐length
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
39 size_t body_size = entry->capacity;
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
40 const char *template =
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
41 "HTTP/1.1 200 OK\r\n"
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
42 "Content-Type: text/html\r\n"
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
43 "Content-Length: %zu\r\n"
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
44 "Connection: close\r\n"
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
45 "\r\n";
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
46
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
47 // Compute how large the header is and allocate just enough space
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
48 int header_len = snprintf(NULL, 0, template, body_size);
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
49 char *header = malloc(header_len + 1);
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
50 if (!header) {
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
51 perror("malloc");
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
52 return;
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
53 }
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
54 snprintf(header, header_len + 1, template, body_size);
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
55
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
56 Seobeo_Handle_QueueData(cli,
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
57 (const uint8*)header,
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
58 (uint32)(header_len + 1));
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
59 free(header);
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
60
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
61 Seobeo_Handle_QueueData(cli,
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
62 (const uint8*)entry->buffer,
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
63 (uint32)body_size);
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
64
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
65
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
66 Seobeo_Handle_Flush(cli);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
67
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
68 Seobeo_Handle_Destroy(cli);
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
69 }
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents: 0
diff changeset
70
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
71 int main(void)
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
72 {
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
73 struct sigaction sa;
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
74
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
75 cache = Dowa_HashMap_Create(1024);
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
76 if (Dowa_Cache_Folder(cache, "seobeo/pages") != 0)
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
77 {
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
78 perror("Dowa_Cache_Folder");
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
79 return -1;
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
80 }
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
81
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
82 Seobeo_PHandle srv = Seobeo_Stream_Handle_Create(NULL, "8080");
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
83
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
84 if (srv->socket < 0) return 1;
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
85 printf("Listening on port 8080\n");
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
86
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
87 sa.sa_handler = SigchildHandler; // reap all dead processes
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
88 sigemptyset(&sa.sa_mask);
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
89 sa.sa_flags = SA_RESTART;
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
90 if (sigaction(SIGCHLD, &sa, NULL) == -1) {
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
91 perror("sigaction");
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
92 exit(1);
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
93 }
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
94
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
95 while (1) {
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
96 Seobeo_PHandle cli = Seobeo_Stream_Handle_Accept(srv);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
97 if (cli == NULL)
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
98 {
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
99 continue;
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
100 }
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
101 printf("connected to %s\n", cli->host);
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
102
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
103 if (!fork())
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
104 {
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
105 HandleClientRequest(cli);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
106 exit(0);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
107 }
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
108 Seobeo_Handle_Destroy(cli);
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
109 }
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
110
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
111 Seobeo_Handle_Destroy(srv);
0
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
112 return 0;
5695ef413be0 Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
113 }