diff --git a/lab10/client_tcp.c b/lab10/client_tcp.c new file mode 100644 index 0000000..654c0ee --- /dev/null +++ b/lab10/client_tcp.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include + +int client_tcp() { + char* hostname = "localhost"; + char* port = "9004"; + + struct addrinfo hints = {0}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + struct addrinfo* res; + int err_ret = getaddrinfo(hostname, port, &hints, &res); + + if (err_ret != 0) { + fprintf(stderr, "getaddrinfo got error code: %d\n", err_ret); + return -1; + } + + int sfd = -1; + for (struct addrinfo* i = res; i != NULL; i = i->ai_next) { + sfd = socket(i->ai_family, i->ai_socktype, i->ai_protocol); + if (sfd == -1) { + perror("socket"); + continue; + } + + int connect_err = connect(sfd, i->ai_addr, i->ai_addrlen); + if (connect_err == -1) { + perror("connect client tcp"); + continue; + } + break; + } + + freeaddrinfo(res); + if (sfd == -1) { + fprintf(stderr, "couldn't create client socket\n"); + return -1; + } + return sfd; +} + +int main(void) { + int sfd_client = client_tcp(); + + char* my_string = "message from tcp client"; + write(sfd_client, my_string, strlen(my_string) + 1); + + char buf[1000]; + read(sfd_client, buf, 1000); + + printf("Client recieved from server: `%s`\n", buf); + close(sfd_client); +} diff --git a/lab10/server_tcp.c b/lab10/server_tcp.c new file mode 100644 index 0000000..94753d1 --- /dev/null +++ b/lab10/server_tcp.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include + +int server_tcp() { + char* hostname = "localhost"; + char* port = "9004"; + + struct addrinfo hints = {0}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + struct addrinfo* res; + int err_ret = getaddrinfo(hostname, port, &hints, &res); + if (err_ret != 0) { + fprintf(stderr, "getaddrinfo got error code: %d\n", err_ret); + return -1; + } + + int sfd = -1; + for (struct addrinfo* i = res; i != NULL; i = i->ai_next) { + sfd = socket(i->ai_family, i->ai_socktype, i->ai_protocol); + if (sfd == -1) { + perror("socket"); + continue; + } + + int err_ = bind(sfd, i->ai_addr, i->ai_addrlen); + if (err_ == -1) { + perror("bind server tcp"); + close(sfd); + continue; + } + + err_ = listen(sfd, 100); + if (err_ == -1) { + perror("listen server tcp"); + close(sfd); + continue; + } + + break; + } + + freeaddrinfo(res); + return sfd; +} + +void* echo_server(int sfd_server, int sfd_client) { + printf("socket server: %d\n", sfd_server); + printf("socket client: %d\n", sfd_client); + + char buf[1000]; + int len; + while (1) { + len = read(sfd_client, buf, 1000); + + if (len == 0) { + continue; + } + + printf("Got length: %d\n", len); + printf("Server received message: `%s`\n", buf); + break; + } + + char* new_msg = "Some new string from the server"; + write(sfd_client, new_msg, strlen(new_msg) + 1); + + close(sfd_client); + return NULL; +} + + +int main(void) { + int sfd_server = server_tcp(); + int sfd_client = accept(sfd_server, NULL, NULL); + + if (sfd_client == -1) { + perror("accept server tcp"); + return 1; + } + + echo_server(sfd_server, sfd_client); + + close(sfd_server); +}