From c8a987daefa1475b1902b9823e8d2ef4500943cd Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Thu, 29 Jun 2023 01:47:35 -0500 Subject: Sockets update --- examples/client.sloth | 21 +++++++++++++++----- examples/server.sloth | 12 +++++++++--- std/stdsocket.c | 54 ++++++++++++++++++++++++++++++++++++++------------- std/stdsocket.sloth | 6 +++--- 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/examples/client.sloth b/examples/client.sloth index 8b7f737..26a902f 100644 --- a/examples/client.sloth +++ b/examples/client.sloth @@ -1,9 +1,20 @@ fn main() Int { - var sockint: Int = clientsock(); + var sockint: Int = clientsock(8080, "127.0.0.1"); println(recvsock(sockint)); - while true { - sendsock(readln(), sockint); - } - closesock(sockint); + var con: Bool = true; + while con == true { + print("send> "); + var msg: String = readln(); + sendsock(msg, sockint); + if sequals(msg, "KILLCLIENT") { + con = false; + } + println("wait..."); + msg = recvsock(sockint); + print("server: "); + println(msg); + + } + closesock(sockint, false); return 0; } diff --git a/examples/server.sloth b/examples/server.sloth index 201f8a2..3329471 100644 --- a/examples/server.sloth +++ b/examples/server.sloth @@ -1,14 +1,20 @@ fn main() Int { - var sockint: Int = serversock(); + var sockint: Int = serversock(8080, "auto", 10); + println("slothnet has initialized!"); sendsock("Welcome to slothnet!", sockint); var con: Bool = true; while con == true { + println("wait..."); var msg: String = recvsock(sockint); + print("client: "); println(msg); - if sequals(msg, "kill") { + print("send> "); + msg = readln(); + sendsock(msg, sockint); + if sequals(msg, "KILLSERV") { con = false; } } - closesock(sockint); + closesock(sockint, true); return 0; } diff --git a/std/stdsocket.c b/std/stdsocket.c index 592291d..7f2a02c 100644 --- a/std/stdsocket.c +++ b/std/stdsocket.c @@ -4,31 +4,56 @@ #include #include #include -#define PORT 8080 +#include -int serversock() { +int serversock(int PORT, char* addr, int backlog) { int opt = 1; - int sock = socket(AF_INET, SOCK_STREAM, 0); - struct sockaddr_in address; + int sock, new_sock; + struct sockaddr_in address; int addrlen = sizeof(address); - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)); + + if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) < 0 ) { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; + if (sequals(addr, "auto")) { + address.sin_addr.s_addr = INADDR_ANY; + } else { + inet_aton(addr, &address.sin_addr.s_addr); + } address.sin_port = htons(PORT); - bind(sock, (struct sockaddr*)&address, sizeof(address)); - listen(sock, 3); - int new_sock = accept(sock, (struct sockaddr*)&address, (socklen_t*)&addrlen); + if (bind(sock, (struct sockaddr*)&address, sizeof(address)) < 0) { + perror("bind"); + exit(EXIT_FAILURE); + } + if (listen(sock, backlog) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + + if ((new_sock = accept(sock, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } return new_sock; } -int clientsock() { + +int clientsock(int PORT, char* server_ip) { struct sockaddr_in serv_addr; - int sock = socket(AF_INET, SOCK_STREAM, 0); + int sock = socket(PF_INET, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); - inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); + inet_pton(AF_INET, server_ip, &serv_addr.sin_addr); int status = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); return sock; } @@ -43,6 +68,9 @@ void sendsock(char* msg, int soc) { send(soc, msg, strlen(msg), 0); } -void closesock(int soc) { +void closesock(int soc, bool server) { close(soc); + if (server) { + shutdown(soc, SHUT_RDWR); + } } diff --git a/std/stdsocket.sloth b/std/stdsocket.sloth index 46a5328..68576a0 100644 --- a/std/stdsocket.sloth +++ b/std/stdsocket.sloth @@ -1,5 +1,5 @@ -foreign fn serversock() Int; -foreign fn clientsock() Int; -foreign fn closesock(soc: Int); +foreign fn serversock(port: Int, addr: String, backlog: Int) Int; +foreign fn clientsock(port: Int, addr: String) Int; +foreign fn closesock(soc: Int, server:Bool); foreign fn sendsock(msg: String, soc: Int); foreign fn recvsock(soc: Int) String; -- cgit v1.2.3