From c8a987daefa1475b1902b9823e8d2ef4500943cd Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Thu, 29 Jun 2023 01:47:35 -0500 Subject: Sockets update --- std/stdsocket.c | 54 ++++++++++++++++++++++++++++++++++++++++------------- std/stdsocket.sloth | 6 +++--- 2 files changed, 44 insertions(+), 16 deletions(-) (limited to 'std') 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