#include #include #include #include #include #include #include #include #include volatile int alive = 1; void sigterm(int s) { printf("Sigterm received...\n"); alive = 0; return; } void sigint(int s) { printf("Sigint received...\n"); alive = 0; return; } int main(int argc, char **argv) { struct sigaction sig; struct sockaddr_in sa; int sfd, tmp; memset(&sig, 0, sizeof(sig)); sig.sa_handler = sigterm; sigaction(SIGTERM, &sig, NULL); sig.sa_handler = sigint; sigaction(SIGINT, &sig, NULL); memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sfd = socket(AF_INET, SOCK_STREAM, 0); bind(sfd, (struct sockaddr *)&sa, sizeof(sa)); listen(sfd, 20); tmp = sizeof(sa); getsockname(sfd, (struct sockaddr *)&sa, &tmp); printf("Bound to: %d\n", ntohs(sa.sin_port)); while(alive) { int cfd, socklen; struct sockaddr_in csa; printf("Alive...\n"); socklen = sizeof(csa); cfd = accept(sfd, (struct sockaddr *)&csa, &socklen); printf("Accept received: %d\n", cfd); if(cfd < 0) { printf("Error return: %d with errno %d (%s)\n", cfd, errno, strerror(errno)); } write(cfd, "Goodbye.\r\n", strlen("Goodbye.\r\n")); shutdown(cfd, 2); close(cfd); } printf("Done, alive cleared.\n"); close(sfd); exit(1); }