commit 465f405cd1636436bcfe9091719cf65a5ca6bd06 Author: hellerve Date: Mon Sep 18 09:06:18 2017 +0200 make it so diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..73f862c --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +TARGET=862 +BUILDDIR=bin/ +PREFIX=/usr/local/bin/ +MAIN=main.c +override CFLAGS+=-Werror -Wall -g -fPIC -O2 -DNDEBUG -ftrapv -Wfloat-equal -Wundef -Wwrite-strings -Wuninitialized -pedantic -std=gnu11 + +all: main.c + mkdir -p $(BUILDDIR) + $(CC) $(MAIN) -o $(BUILDDIR)$(TARGET) $(CFLAGS) + +install: all + install $(BUILDDIR)$(TARGET) $(PREFIX)$(TARGET) + +uninstall: + rm -rf $(PREFIX)$(TARGET) diff --git a/README.md b/README.md new file mode 100644 index 0000000..f4e68c2 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# 862 + +An implementation of [RFC 862](https://tools.ietf.org/html/rfc862), the “echo” +service, for the heck of it. + +## Limitations + +This only echos back messages up to 256 characters. That really ought to be +enough for everyone. It also doesn’t notice when a client dies, which is not +great. diff --git a/main.c b/main.c new file mode 100644 index 0000000..93552b5 --- /dev/null +++ b/main.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +void die(const char *msg) { + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) { + int sockfd; + int newsockfd; + int port = 7; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + char msg[256]; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) die("error opening socket."); + + 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(port); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) die("error binding socket."); + + clilen = sizeof(cli_addr); + + while (1) { + listen(sockfd, 5); + + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + if (newsockfd < 0) die("error accepting"); + + while (1) { + memset(msg, 0, sizeof(msg)); + n = read(newsockfd, msg, 256); + if (n < 0) break; + + n = write(newsockfd, msg, strlen(msg)); + if (n < 0) break; + + } + close(newsockfd); + } + + close(sockfd); + return 0; +}