diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | tcpserver.c | 89 |
2 files changed, 91 insertions, 1 deletions
@@ -1,5 +1,6 @@ BINS = ascii class depipe_strings dup fpipe pipe realloc strpbrk strsep \ - tokenizer getopt prime_mask linked_list pi_bbp string_tokenizer + tokenizer getopt prime_mask linked_list pi_bbp string_tokenizer \ + tcpserver CC = gcc CFLAGS = -Wall -std=gnu99 -pedantic DBGFLAGS = -g -O0 diff --git a/tcpserver.c b/tcpserver.c new file mode 100644 index 0000000..5eca180 --- /dev/null +++ b/tcpserver.c @@ -0,0 +1,89 @@ +/* tcpserver.c + * + * TCP Server + * note: 'echo "hello" | nc localhost 8080' to send messages to the server + * + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <sys/uio.h> +#include <sys/socket.h> +#include <sys/select.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> + +int main(int argc, char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "usage: %s <port> <dir>\n", argv[0]); + exit(1); + } + + int server_sockfd, ret; + + if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) + { + perror("socket"); + close(server_sockfd); + exit(-1); + } + + /* allow fast reuse of ports */ + int reuse_true = 1; + setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_true, + sizeof(reuse_true)); + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(atoi(argv[1])); + addr.sin_addr.s_addr = INADDR_ANY; + + if (bind(server_sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) + { + perror("bind"); + exit(-1); + } + + struct sockaddr_in remote_addr; + unsigned int socklen = sizeof(remote_addr); + + while (1) + { + if (listen(server_sockfd, 0) == -1) + { + perror("listen"); + exit(-1); + } + + int sockfd; + sockfd = accept(server_sockfd, (struct sockaddr *) &remote_addr, &socklen); + if (sockfd == -1) + { + perror("socket"); + close(sockfd); + exit(-1); + } + + char buf[255] = { 0 }; + if ((ret = recv(sockfd, buf, sizeof(buf), 0)) < 0) + { + perror("recv"); + exit(-1); + } + + printf("%s", buf); + shutdown(sockfd, SHUT_RDWR); + close(sockfd); + } + + shutdown(server_sockfd, SHUT_RDWR); + close(server_sockfd); +} + |