summaryrefslogtreecommitdiff
path: root/src/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket')
-rw-r--r--src/socket/socket.h2
-rw-r--r--src/socket/socket_linux.c10
-rw-r--r--src/socket/socket_windows.c19
3 files changed, 29 insertions, 2 deletions
diff --git a/src/socket/socket.h b/src/socket/socket.h
index e1b203a..3872bd4 100644
--- a/src/socket/socket.h
+++ b/src/socket/socket.h
@@ -80,5 +80,7 @@ ssize_t nn_socket_write(struct nn_socket *sock, void *buf, size_t size);
ssize_t nn_socket_sendto(struct nn_socket *sock, void *buf, size_t size);
ssize_t nn_socket_recvfrom(struct nn_socket *sock, void *buf, size_t size);
+bool nn_socket_check_error(ssize_t ret);
+
void nn_socket_shutdown(struct nn_socket *sock);
void nn_socket_close(struct nn_socket *sock);
diff --git a/src/socket/socket_linux.c b/src/socket/socket_linux.c
index d854644..70d9184 100644
--- a/src/socket/socket_linux.c
+++ b/src/socket/socket_linux.c
@@ -277,6 +277,16 @@ ssize_t nn_socket_recvfrom(struct nn_socket *sock, void *buf, size_t size)
return recvfrom(sock->fd, buf, size, 0, sock->addrinfo->ai_addr, &sock->addrinfo->ai_addrlen);
}
+// This would normally be a log_warn() but we rely on expected errors for control flow.
+bool nn_socket_check_error(ssize_t ret)
+{
+ if (ret < 0) {
+ log_debug("Socket error: %s (%d).", nn_strerror(errno), errno);
+ return true;
+ }
+ return false;
+}
+
s32 nn_socket_get_fd(struct nn_socket *sock)
{
return sock->fd;
diff --git a/src/socket/socket_windows.c b/src/socket/socket_windows.c
index 123640e..69fa55b 100644
--- a/src/socket/socket_windows.c
+++ b/src/socket/socket_windows.c
@@ -1,6 +1,8 @@
#define AL_LOG_SECTION "socket"
#include <al/log.h>
+#include "../util/error.h"
+
#include "socket.h"
#include "socket_internal.h"
#include "net.h"
@@ -125,12 +127,12 @@ s32 nn_socket_get_fd(struct nn_socket *sock)
ssize_t nn_socket_read(struct nn_socket *sock, void *buf, size_t size)
{
- return recv(sock->fd, buf, (s32)size, 0);
+ return (ssize_t)recv(sock->fd, buf, (s32)size, 0);
}
ssize_t nn_socket_write(struct nn_socket *sock, void *buf, size_t size)
{
- return send(sock->fd, buf, (s32)size, 0);
+ return (ssize_t)send(sock->fd, buf, (s32)size, 0);
}
ssize_t nn_socket_sendto(struct nn_socket *sock, void *buf, size_t size)
@@ -149,6 +151,17 @@ ssize_t nn_socket_recvfrom(struct nn_socket *sock, void *buf, size_t size)
return 0;
}
+bool nn_socket_check_error(ssize_t ret)
+{
+ if (ret == SOCKET_ERROR) {
+ s32 err = WSAGetLastError();
+ char *strerror = nn_win32_error_message(err);
+ log_debug("Socket error: %s (%d).", strerror ? strerror : "(None)", err);
+ return true;
+ }
+ return false;
+}
+
void nn_socket_shutdown(struct nn_socket *sock)
{
if (shutdown(sock->fd, SD_BOTH) == SOCKET_ERROR) {}
@@ -157,5 +170,7 @@ void nn_socket_shutdown(struct nn_socket *sock)
void nn_socket_close(struct nn_socket *sock)
{
_close(sock->internal_fd);
+ // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/close?view=msvc-170
+ // Based on these docs, I assume calling closesocket() is not necessary.
//closesocket(sock->fd);
}