aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2023-06-29 01:47:35 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2023-06-29 01:47:35 -0500
commitc8a987daefa1475b1902b9823e8d2ef4500943cd (patch)
tree6b4d83afc7daee73d4560e0049fb4f83e8a843a4 /std
parentdd3906c96555805af2580d593cf9429170b07a02 (diff)
downloadsloth-c8a987daefa1475b1902b9823e8d2ef4500943cd.tar.gz
Sockets update
Diffstat (limited to 'std')
-rw-r--r--std/stdsocket.c54
-rw-r--r--std/stdsocket.sloth6
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;