summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-08-29 18:20:53 -0500
committerKamil Kaminski <kamilkss@gmail.com>2011-08-29 18:20:53 -0500
commit6161b42693193db3eadf9ebf12d5976f8acdd54c (patch)
tree5bf4a3042a387608fe7389be4cd9caecd3f43d45
parent918b0fafad5d48f7c1c1fc8b19e86e87bab9238b (diff)
downloadsandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.tar.gz
sandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.tar.bz2
sandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.zip
sockets: add a tcp server example
-rw-r--r--Makefile3
-rw-r--r--tcpserver.c89
2 files changed, 91 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 59b02eb..686a8d7 100644
--- a/Makefile
+++ b/Makefile
@@ -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);
+}
+