summaryrefslogtreecommitdiff
path: root/xs_socket.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2022-09-19 20:41:11 +0200
committerdefault <nobody@localhost>2022-09-19 20:41:11 +0200
commit67288a763b8bceadbb128d2cf5bdc431ba8a686f (patch)
tree0a0bc1922016bbd3d3cd2ec3c80a033970280a9f /xs_socket.h
parentef03035ef0af5a68ba7e03ae834a43db5dd3a8e3 (diff)
Imported xs.
Diffstat (limited to 'xs_socket.h')
-rw-r--r--xs_socket.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/xs_socket.h b/xs_socket.h
new file mode 100644
index 0000000..c5eab80
--- /dev/null
+++ b/xs_socket.h
@@ -0,0 +1,95 @@
+/* copyright (c) 2022 grunfink - MIT license */
+
+#ifndef _XS_SOCKET_H
+
+#define _XS_SOCKET_H
+
+int xs_socket_timeout(int s, float rto, float sto);
+int xs_socket_server(char *addr, int port);
+FILE *xs_socket_accept(int rs);
+
+
+#ifdef XS_IMPLEMENTATION
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+
+
+int xs_socket_timeout(int s, float rto, float sto)
+/* sets the socket timeout in seconds */
+{
+ struct timeval tv;
+ int ret = 0;
+
+ if (rto > 0.0) {
+ tv.tv_sec = (int)rto;
+ tv.tv_usec = (int)((rto - (float)(int)rto) * 1000000.0);
+
+ ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
+ }
+
+ if (sto > 0.0) {
+ tv.tv_sec = (int)sto;
+ tv.tv_usec = (int)((sto - (float)(int)sto) * 1000000.0);
+
+ ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
+ }
+
+ return ret;
+}
+
+
+int xs_socket_server(char *addr, int port)
+/* opens a server socket */
+{
+ int rs = -1;
+ struct sockaddr_in host;
+
+ memset(&host, '\0', sizeof(host));
+
+ if (addr != NULL) {
+ struct hostent *he;
+
+ if ((he = gethostbyname(addr)) != NULL)
+ memcpy(&host.sin_addr, he->h_addr_list[0], he->h_length);
+ else
+ goto end;
+ }
+
+ host.sin_family = AF_INET;
+ host.sin_port = htons(port);
+
+ if ((rs = socket(AF_INET, SOCK_STREAM, 0)) != -1) {
+ /* reuse addr */
+ int i = 1;
+ setsockopt(rs, SOL_SOCKET, SO_REUSEADDR, (char *)&i, sizeof(i));
+
+ if (bind(rs, (struct sockaddr *)&host, sizeof(host)) == -1) {
+ close(rs);
+ rs = -1;
+ }
+ else
+ listen(rs, SOMAXCONN);
+ }
+
+end:
+ return rs;
+}
+
+
+FILE *xs_socket_accept(int rs)
+/* accepts an incoming connection */
+{
+ int cs = -1;
+ struct sockaddr_in host;
+ socklen_t l = sizeof(host);
+
+ cs = accept(rs, (struct sockaddr *)&host, &l);
+
+ return cs == -1 ? NULL : fdopen(cs, "r+");
+}
+
+#endif /* XS_IMPLEMENTATION */
+
+#endif /* _XS_SOCKET_H */ \ No newline at end of file