About
Trying to learn C by doing. This is an attempt on a very basic http server that serves static files out of a directory.
- Uses non-blocking io sockets and edge-triggered polling with epoll.
Usage
docker build -t c-program .
docker run \
-it \
--name c-program-dev \
-v "$(pwd)"/src:/usr/src/app/src \
-v "$(pwd)"/website:/usr/src/app/website \
-p 80:80 \
c-program bash
# For subsequent runs
docker start -i c-program-dev
make
./bin/startServer --port=8080 --dir=./website
Todos
-
Parse header up to /r/n/r/n point and extract target uri and get static file location
-
Create struct to store connection data and set its pointer to epoll_event data *ptr
- source file descriptor
- *method
- *uri
- *header_field
- key (strdup)
- value (strdup)
- header_size
- *number of bytes sent
- Use sendfile to send data to client. Close connection once complete. If error EGAIN - continue, if zero means EOF
References
- Beej's Guide to Network Programming
- Using poll() instead of select()
- Blocking I/O, Nonblocking I/O, And Epoll
- LibHTTP – Open Source HTTP Library in C
- HTTP Server: Everything you need to know to Build a simple HTTP server from scratch
- HTTP Server in C
- https://gist.github.com/bdahlia/7826649
- https://gist.github.com/laobubu/d6d0e9beb934b60b2e552c2d03e1409e
- epoll tutorial