diff options
Diffstat (limited to 'cptc.c')
| -rw-r--r-- | cptc.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/cptc.c b/cptc.c new file mode 100644 index 0000000..60c1954 --- /dev/null +++ b/cptc.c @@ -0,0 +1,54 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <unistd.h> + +#include "cptc.h" + + +#define error(text, status) \ + do \ + { \ + perror(text); \ + exit(status); \ + } while (0) \ + + +void CPTC(const char *ip, in_port_t port) +{ + struct sockaddr_in addr, peer; + socklen_t peer_size; + int fd, peerfd; + + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + error("socket()", 1); + + addr = (struct sockaddr_in) + { + .sin_addr.s_addr = inet_addr(ip), + .sin_port = htons(port), + .sin_family = AF_INET, + }; + + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + error("bind()", 1); + if (listen(fd, 128) == -1) + error("listen()", 3); + + printf("Started serving at %s:%d\n", ip, port); + for (;;) + { + peer_size = sizeof(peer); + if ((peerfd = accept(fd, (struct sockaddr *)&peer, &peer_size)) < 0) + { + perror("accept()"); + continue; + } + printf("Connection from %s:%u!\n", inet_ntoa(peer.sin_addr), peer.sin_port); + + CPTC_requestHandler(peerfd); + close(peerfd); + } +} |