public
Description: An exercise to rewrite my blog with C
Homepage: http://oebfare.com
Clone URL: git://github.com/brosner/oebfare-in-c.git
Added the most basic socket code for the HTTP server.
brosner (author)
Tue Apr 15 09:08:45 -0700 2008
commit  0058c802e16b508c04a3418d48dd446325587670
tree    2276786ad3505607d4f7d298c1647d738ffdb248
parent  02e5af9b1ee9bd86e6767784b79b605151672fd3
0
...
11
12
13
 
14
15
 
16
17
18
 
 
19
20
21
...
11
12
13
14
15
 
16
17
 
 
18
19
20
21
22
0
@@ -11,11 +11,12 @@ void process_parameters(int argc, char **argv)
0
 int main(int argc, char **argv)
0
 {
0
     oebfare_server srv;
0
+ oebfare_server_new (&srv);
0
     
0
- process_parameters(argc, argv);
0
+ process_parameters (argc, argv);
0
     
0
- oebfare_server_init(&srv);
0
- oebfare_server_cycle(&srv);
0
+ oebfare_server_init (&srv);
0
+ oebfare_server_cycle (&srv);
0
     
0
     return 0;
0
 }
...
1
 
 
 
 
2
 
 
3
4
5
 
6
7
8
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
11
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
...
1
2
3
4
5
6
7
8
9
10
 
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
0
@@ -1,13 +1,53 @@
0
 
0
+#include <sys/types.h>
0
+#include <sys/socket.h>
0
+#include <netinet/in.h>
0
+#include <arpa/inet.h>
0
 #include <stdio.h>
0
+#include <unistd.h>
0
+
0
 #include "server.h"
0
 
0
-void oebfare_server_init (oebfare_server *srv)
0
+void oebfare_server_new (oebfare_server *srv)
0
 {
0
     srv->port = DEFAULT_LISTEN_PORT;
0
 }
0
 
0
+int oebfare_server_init (oebfare_server *srv)
0
+{
0
+ srv->socket = socket (AF_INET, SOCK_STREAM, 0);
0
+ if (srv->socket < 0) {
0
+ fprintf (stderr, "cannot open socket\n");
0
+ return -1;
0
+ }
0
+
0
+ srv->addr.sin_family = AF_INET;
0
+ /* TODO: move into the srv struct */
0
+ srv->addr.sin_addr.s_addr = htonl (INADDR_ANY);
0
+ srv->addr.sin_port = htons (srv->port);
0
+
0
+ if (bind(srv->socket, (struct sockaddr *) &srv->addr, sizeof(srv->addr)) < 0) {
0
+ fprintf (stderr, "cannot bind port\n");
0
+ return -1;
0
+ }
0
+}
0
+
0
 void oebfare_server_cycle (oebfare_server *srv)
0
 {
0
- printf("listening on port %d\n", srv->port);
0
+ int cli_socket, cli_len;
0
+ struct sockaddr_in cli_addr;
0
+
0
+ listen (srv->socket, 5);
0
+
0
+ cli_len = sizeof (cli_addr);
0
+ while (1) {
0
+ cli_socket = accept (srv->socket, (struct sock_addr *) &cli_addr, &cli_len);
0
+ if (cli_socket < 0) {
0
+ fprintf (stderr, "cannot accept connection\n");
0
+ continue;
0
+ }
0
+
0
+ printf ("accepted a connection, now what?\n");
0
+ close (cli_socket);
0
+ }
0
 }
...
2
3
4
 
 
5
6
7
8
 
 
9
10
11
 
 
12
13
14
...
2
3
4
5
6
7
8
9
10
11
12
13
14
 
15
16
17
18
19
0
@@ -2,13 +2,18 @@
0
 #ifndef OEBFARE_SERVER_H
0
 #define OEBFARE_SERVER_H
0
 
0
+#include <netinet/in.h>
0
+
0
 #define DEFAULT_LISTEN_PORT 80
0
 
0
 typedef struct _oebfare_server {
0
     int port;
0
+ int socket;
0
+ struct sockaddr_in addr;
0
 } oebfare_server;
0
 
0
-void oebfare_server_init (oebfare_server *srv);
0
+void oebfare_server_new (oebfare_server *srv);
0
+int oebfare_server_init (oebfare_server *srv);
0
 void oebfare_server_cycle (oebfare_server *srv);
0
 
0
 #endif

Comments

    No one has commented yet.