Mercurial
annotate seobeo/main.c @ 1:adcfad6e86fb
Updated naming and separated out some logic within seobeo.
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Wed, 24 Sep 2025 09:11:20 -0700 |
| parents | 5695ef413be0 |
| children | 2758f5527d2b |
| 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 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
7 void SigchildHandler(int s) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
8 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
9 (void)s; // quiet unused variable warning |
|
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 // 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
|
12 int saved_errno = errno; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
13 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
14 while(waitpid(-1, NULL, WNOHANG) > 0); |
|
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 errno = saved_errno; |
|
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 |
|
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 void *GetInternetaddr(struct sockaddr *sa) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
21 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
22 if (sa->sa_family == AF_INET) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
23 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
24 return &(((struct sockaddr_in*)sa)->sin_addr); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
25 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
26 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
27 return &(((struct sockaddr_in6*)sa)->sin6_addr); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
28 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
29 |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
30 void HandleClientRequest(int client_fd) |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
31 { |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
32 FILE *file = fopen("seobeo/index.html", "rb"); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
33 if (!file) { |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
34 perror("fopen"); |
|
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 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
38 fseek(file, 0, SEEK_END); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
39 size_t size = ftell(file); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
40 fseek(file, 0, SEEK_SET); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
41 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
42 char *data = malloc(size); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
43 fread(data, 1, size, file); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
44 fclose(file); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
45 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
46 char *header = malloc(100); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
47 sprintf( |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
48 header, |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
49 "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
|
50 "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
|
51 "Content-Length: %zu\r\n" |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
52 "Connection: close\r\n" |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
53 "\r\n", |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
54 size |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
55 ); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
56 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
57 send(client_fd, header, strlen(header), 0); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
58 ssize_t total_sent = 0; |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
59 while (total_sent < size) |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
60 { |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
61 ssize_t sent = send(client_fd, data + total_sent, size - total_sent, 0); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
62 if (sent <= 0) break; |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
63 total_sent += sent; |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
64 } |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
65 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
66 close(client_fd); |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
67 } |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
68 |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
69 int main(void) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
70 { |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
71 int32 client_fd; |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
72 struct sockaddr_storage client_addr; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
73 socklen_t sin_size; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
74 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
75 char client_inet_addr[INET6_ADDRSTRLEN]; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
76 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
77 struct sigaction sa; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
78 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
79 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
|
80 sigemptyset(&sa.sa_mask); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
81 sa.sa_flags = SA_RESTART; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
82 if (sigaction(SIGCHLD, &sa, NULL) == -1) { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
83 perror("sigaction"); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
84 exit(1); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
85 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
86 |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
87 int sock_fd = Seobeo_CreateSocket(1, "6969", 10); |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
88 |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
89 printf("server: waiting for connections...\n"); |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
90 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
91 while (1) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
92 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
93 sin_size = sizeof(client_addr); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
94 client_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
95 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
96 if (client_fd == -1) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
97 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
98 perror("accept"); |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
99 break; |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
100 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
101 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
102 inet_ntop( |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
103 client_addr.ss_family, |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
104 GetInternetaddr((struct sockaddr *)&client_addr), |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
105 client_inet_addr, sizeof client_inet_addr); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
106 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
107 printf("server: got connection from %s\n", client_inet_addr); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
108 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
109 // Create a child process |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
110 if (!fork()) |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
111 { |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
112 close(sock_fd); |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
0
diff
changeset
|
113 HandleClientRequest(client_fd); |
|
0
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
114 exit(0); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
115 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
116 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
117 close(client_fd); |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
118 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
119 |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
120 return 0; |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
121 } |
|
5695ef413be0
Initialized mono repo with bazels with few examples.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
122 |