Last active
July 30, 2017 08:04
-
-
Save jethrocarr/c56cecbf111af8c29791f89a2c30b978 to your computer and use it in GitHub Desktop.
Tiny HTTP server to respond OK on port 9000 - handy for health checks on embedded boxes!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Based on http://tinyhack.com/2014/03/12/implementing-a-web-server-in-a-single-printf-call/ | |
*/ | |
#include<stdio.h> | |
#include<string.h> | |
#include<stdlib.h> | |
#include<unistd.h> | |
#include<sys/types.h> | |
#include<sys/stat.h> | |
#include<sys/socket.h> | |
#include<arpa/inet.h> | |
#include<netdb.h> | |
#include<signal.h> | |
#include<fcntl.h> | |
int main(int argc, char *argv[]) | |
{ | |
int countforks = 0; | |
int waitint; | |
int sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
// If we don't do SO_REUSEADDR, the app fails to start sometime from connections | |
// of the last instance that are still around and not yet timed out. | |
int reuseaddr = 1; | |
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)); | |
struct sockaddr_in serv_addr; | |
bzero((char *)&serv_addr, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_addr.s_addr = INADDR_ANY; | |
serv_addr.sin_port = htons(9000); | |
bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); | |
listen(sockfd, 5); | |
while (1) { | |
int cfd = accept(sockfd, 0, 0); | |
char *s = "HTTP/1.0 200\r\nContent-type:text/plain\r\n\r\nHello world!\r\n"; | |
countforks++; | |
if (fork()==0) { | |
write(cfd, s, strlen(s)); | |
shutdown(cfd, SHUT_RDWR); | |
close(cfd); | |
exit(0); | |
} else { | |
// because we listen in the main process the socket ends up open in both the child | |
// and the parent. We need to close it in the parent to prevent socket leakage. | |
close(cfd); | |
// We need to waitpid for all child processes to stop us having zombies piling up | |
int i; for (i=0; i<=countforks; i++) { | |
if (waitpid(-1, &waitint, WNOHANG)) { | |
countforks--; | |
} | |
} | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment