diff options
author | Kyle K <kylek389@gmail.com> | 2011-08-29 18:20:53 -0500 |
---|---|---|
committer | Kamil Kaminski <kamilkss@gmail.com> | 2011-08-29 18:20:53 -0500 |
commit | 6161b42693193db3eadf9ebf12d5976f8acdd54c (patch) | |
tree | 5bf4a3042a387608fe7389be4cd9caecd3f43d45 /tcpserver.c | |
parent | 918b0fafad5d48f7c1c1fc8b19e86e87bab9238b (diff) | |
download | sandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.tar.gz sandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.tar.bz2 sandbox-6161b42693193db3eadf9ebf12d5976f8acdd54c.zip |
sockets: add a tcp server example
Diffstat (limited to 'tcpserver.c')
-rw-r--r-- | tcpserver.c | 89 |
1 files changed, 89 insertions, 0 deletions
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); +} + |