From 21dfb8c73b2bbfd1ae535c70594ed0326e954084 Mon Sep 17 00:00:00 2001 From: RinRi Date: Thu, 28 Jul 2022 18:22:47 +0600 Subject: [PATCH] initial commit --- .gitignore | 1 + Makefile | 11 +++++++++ httpreq.c | 58 +++++++++++++++++++++++++++++++++++++++++++ server.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ showip.c | 53 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 195 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 httpreq.c create mode 100644 server.c create mode 100644 showip.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa92975 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.out \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7d7042c --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +CC = gcc +CFLAGS = -O0 +SRC = *.c + +all: $(patsubst %.c, %.out, $(wildcard *.c)) + +%.out: %.c Makefile + $(CC) $(CFLAGS) $< -o $@ + +clean: + rm *.out diff --git a/httpreq.c b/httpreq.c new file mode 100644 index 0000000..6831275 --- /dev/null +++ b/httpreq.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// TODO: fix over buf overflow +void fillHttpReq(char *buf, char *host, size_t size) { + char *req = "GET / HTTP/1.1\r\nHost: \0"; + memcpy(buf, req, strlen(req)); + memcpy(buf + strlen(buf), host, strlen(host)); + memcpy(buf + strlen(buf), "\r\n\r\n", strlen("\r\n\r\n")); +} + +int main(int argc, char **argv) { + int status; + struct addrinfo hints; + struct addrinfo *servinfo; + + if (argc != 2) { + fprintf(stderr, "Usage: %s ", argv[0]); + exit(1); + } + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if ((status = getaddrinfo(argv[1], "80", &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); + exit(1); + } + + int s = socket(servinfo->ai_family, servinfo->ai_socktype, + servinfo->ai_protocol); + printf("%d\n", s); + + int connection; + if ((connection = connect(s, servinfo->ai_addr, servinfo->ai_addrlen)) == + -1) { + fprintf(stderr, "connection error: %d\n", connection); + exit(1); + } + + char buf[10000]; + fillHttpReq(buf, argv[1], 10000); + printf("%s\n", buf); + // TODO: send throw a loop + send(s, buf, 10000, 0); + memset(buf, 0, 10000); + recv(s, buf, 10000, 0); + printf("%s\n", buf); + close(s); + freeaddrinfo(servinfo); +} diff --git a/server.c b/server.c new file mode 100644 index 0000000..998a031 --- /dev/null +++ b/server.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BACKLOG 10 + +int main(int argc, char **argv) { + int status; + struct addrinfo hints; + struct addrinfo *servinfo; + struct sockaddr_storage their_addr; + socklen_t addr_size; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + + if ((status = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); + exit(1); + } + + int s; + if ((s = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) { + fprintf(stderr, "socket error: %d\n", status); + exit(1); + } + + printf("%d\n", s); + int yes=1; + + if ((status = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes)) == -1) { + fprintf(stderr, "setsockopt error: %d\n", status); + exit(1); + } + + if((status = bind(s, servinfo->ai_addr, servinfo->ai_addrlen)) == -1) { + fprintf(stderr, "bind error: %d\n", status); + exit(1); + } + + listen(s, BACKLOG); + + addr_size = sizeof their_addr; + int new_fd = accept(s, (struct sockaddr *)&their_addr, &addr_size); + printf("%d\n", new_fd); + + int t = 10; + char c; + while (t--) { + char *msg = "Hi mom!\0"; + int len = strlen(msg), bytes_sent; + if ((bytes_sent = send(new_fd, msg, len, 0)) == -1) { + fprintf(stderr, "send error: %d\n", status); + exit(1); + } + } + char *msg = "Ja!\0"; + int len = strlen(msg), bytes_sent; + if ((bytes_sent = send(new_fd, msg, len, 0)) == -1) { + fprintf(stderr, "send error: %d\n", status); + exit(1); + } + + + freeaddrinfo(servinfo); +} diff --git a/showip.c b/showip.c new file mode 100644 index 0000000..36eed57 --- /dev/null +++ b/showip.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s ", argv[0]); + exit(1); + } + + int status; + struct addrinfo hints; + memset(&hints, 0, sizeof hints); + + struct addrinfo *servinfo; + + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if ((status = getaddrinfo(argv[1], "80", &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); + exit(1); + } + + struct addrinfo *cur = servinfo; + while (cur) { + void *addr; + char *ipver; + char ipstr[INET6_ADDRSTRLEN]; + + + if (cur->ai_family == AF_INET) { + struct sockaddr_in *temp = (struct sockaddr_in *)cur->ai_addr; + addr = &(temp->sin_addr); + ipver = "IPv4"; + } else if (cur->ai_family == AF_INET6) { + struct sockaddr_in6 *temp = (struct sockaddr_in6 *)cur->ai_addr; + addr = &(temp->sin6_addr); + ipver = "IPv6"; + } + + inet_ntop(cur->ai_family, addr, ipstr, sizeof ipstr); + printf("%s: %s\n", ipver, ipstr); + + cur = cur->ai_next; + } + + freeaddrinfo(servinfo); +}