/* tcpserver.c * * TCP Server * note: 'echo "hello" | nc localhost 8080' to send messages to the server * * */ #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s \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); } if (listen(server_sockfd, 0) == -1) { perror("listen"); exit(-1); } struct sockaddr_in remote_addr; unsigned int socklen = sizeof(remote_addr); while (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); }