diff options
| author | Nic Gaffney <gaffney_nic@protonmail.com> | 2023-06-29 01:47:35 -0500 |
|---|---|---|
| committer | Nic Gaffney <gaffney_nic@protonmail.com> | 2023-06-29 01:47:35 -0500 |
| commit | c8a987daefa1475b1902b9823e8d2ef4500943cd (patch) | |
| tree | 6b4d83afc7daee73d4560e0049fb4f83e8a843a4 /std | |
| parent | dd3906c96555805af2580d593cf9429170b07a02 (diff) | |
| download | sloth-c8a987daefa1475b1902b9823e8d2ef4500943cd.tar.gz | |
Sockets update
Diffstat (limited to 'std')
| -rw-r--r-- | std/stdsocket.c | 54 | ||||
| -rw-r--r-- | std/stdsocket.sloth | 6 |
2 files changed, 44 insertions, 16 deletions
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 <string.h> #include <sys/socket.h> #include <unistd.h> -#define PORT 8080 +#include <stdbool.h> -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; |
