mbed first pass
This commit is contained in:
@@ -6,4 +6,5 @@
|
||||
target_sources(${DUSK_LIBRARY_TARGET_NAME}
|
||||
PUBLIC
|
||||
networkdolphin.c
|
||||
networksocketdolphin.c
|
||||
)
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "network/networksocket.h"
|
||||
#include "assert/assert.h"
|
||||
#include <network.h>
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
|
||||
/** Poll timeout in microseconds — short enough to check the stop flag often. */
|
||||
#define NETWORKSOCKET_DOLPHIN_RECV_TIMEOUT_US 100000
|
||||
|
||||
errorret_t networksocketDolphinInit(networksocket_t *socket) {
|
||||
socket->platform.fd = -1;
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t networksocketDolphinConnect(networksocket_t *nsocket) {
|
||||
struct hostent *he;
|
||||
struct sockaddr_in addr;
|
||||
s32 fd;
|
||||
s32 ret;
|
||||
|
||||
he = net_gethostbyname(nsocket->host);
|
||||
if (!he) {
|
||||
errorThrowState(
|
||||
&nsocket->errorState,
|
||||
"net_gethostbyname(%s) failed",
|
||||
nsocket->host
|
||||
);
|
||||
}
|
||||
|
||||
fd = net_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if(fd == INVALID_SOCKET) {
|
||||
errorThrowState(
|
||||
&nsocket->errorState,
|
||||
"net_socket failed with invalid socket"
|
||||
);
|
||||
} else if (fd < 0) {
|
||||
errorThrowState(
|
||||
&nsocket->errorState,
|
||||
"net_socket failed: %d",
|
||||
(int)fd
|
||||
);
|
||||
}
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(nsocket->port);
|
||||
memcpy(&addr.sin_addr, he->h_addr_list[0], (size_t)he->h_length);
|
||||
|
||||
ret = net_connect(fd, (struct sockaddr *)&addr, sizeof(addr));
|
||||
if (ret < 0) {
|
||||
net_close(fd);
|
||||
errorThrowState(
|
||||
&nsocket->errorState,
|
||||
"net_connect to %s:%u failed: %d",
|
||||
nsocket->host,
|
||||
(unsigned int)nsocket->port,
|
||||
(int)ret
|
||||
);
|
||||
}
|
||||
|
||||
nsocket->platform.fd = fd;
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t networksocketDolphinSend(
|
||||
networksocket_t *socket,
|
||||
const uint8_t *data,
|
||||
size_t len
|
||||
) {
|
||||
size_t total = 0;
|
||||
s32 sent;
|
||||
|
||||
while (total < len) {
|
||||
sent = net_send(
|
||||
socket->platform.fd,
|
||||
(const void *)(data + total),
|
||||
len - total,
|
||||
0
|
||||
);
|
||||
if (sent <= 0) {
|
||||
errorThrowState(
|
||||
&socket->errorState,
|
||||
"net_send failed: %d",
|
||||
(int)sent
|
||||
);
|
||||
}
|
||||
total += (size_t)sent;
|
||||
}
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t networksocketDolphinRecv(
|
||||
networksocket_t *socket,
|
||||
uint8_t *buf,
|
||||
size_t maxLen,
|
||||
size_t *outLen
|
||||
) {
|
||||
struct timeval tv;
|
||||
fd_set readset;
|
||||
s32 ready;
|
||||
s32 received;
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = NETWORKSOCKET_DOLPHIN_RECV_TIMEOUT_US;
|
||||
|
||||
FD_ZERO(&readset);
|
||||
FD_SET(socket->platform.fd, &readset);
|
||||
|
||||
ready = net_select(socket->platform.fd + 1, &readset, NULL, NULL, &tv);
|
||||
if (ready < 0) {
|
||||
errorThrowState(
|
||||
&socket->errorState,
|
||||
"net_select failed: %d",
|
||||
(int)ready
|
||||
);
|
||||
}
|
||||
|
||||
if (ready == 0) {
|
||||
*outLen = 0;
|
||||
errorOk();
|
||||
}
|
||||
|
||||
received = net_recv(socket->platform.fd, buf, maxLen, 0);
|
||||
if (received < 0) {
|
||||
errorThrowState(
|
||||
&socket->errorState,
|
||||
"net_recv failed: %d",
|
||||
(int)received
|
||||
);
|
||||
}
|
||||
|
||||
if (received == 0) {
|
||||
*outLen = NETWORKSOCKET_RECV_CLOSED;
|
||||
errorOk();
|
||||
}
|
||||
|
||||
*outLen = (size_t)received;
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t networksocketDolphinDisconnect(networksocket_t *socket) {
|
||||
if (socket->platform.fd >= 0) {
|
||||
net_close(socket->platform.fd);
|
||||
socket->platform.fd = -1;
|
||||
}
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t networksocketDolphinDispose(networksocket_t *socket) {
|
||||
if (socket->platform.fd >= 0) {
|
||||
net_close(socket->platform.fd);
|
||||
socket->platform.fd = -1;
|
||||
}
|
||||
errorOk();
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "dusk.h"
|
||||
#include "error/error.h"
|
||||
#include <network.h>
|
||||
|
||||
typedef struct networksocket_s networksocket_t;
|
||||
|
||||
typedef struct {
|
||||
s32 fd;
|
||||
} networksocketdolphin_t;
|
||||
|
||||
/**
|
||||
* Initializes platform state (sets fd to -1).
|
||||
*/
|
||||
errorret_t networksocketDolphinInit(networksocket_t *socket);
|
||||
|
||||
/**
|
||||
* Resolves host/port via net_gethostbyname and establishes a TCP connection.
|
||||
*/
|
||||
errorret_t networksocketDolphinConnect(networksocket_t *socket);
|
||||
|
||||
/**
|
||||
* Writes all bytes in data to the socket. Loops on partial sends.
|
||||
*/
|
||||
errorret_t networksocketDolphinSend(
|
||||
networksocket_t *socket,
|
||||
const uint8_t *data,
|
||||
size_t len
|
||||
);
|
||||
|
||||
/**
|
||||
* Polls for incoming data with a short timeout (via net_select) so the
|
||||
* socket thread can periodically check its stop flag. Sets *outLen to bytes
|
||||
* received, 0 on timeout, or NETWORKSOCKET_RECV_CLOSED when peer closed.
|
||||
*/
|
||||
errorret_t networksocketDolphinRecv(
|
||||
networksocket_t *socket,
|
||||
uint8_t *buf,
|
||||
size_t maxLen,
|
||||
size_t *outLen
|
||||
);
|
||||
|
||||
/**
|
||||
* Closes the socket file descriptor.
|
||||
*/
|
||||
errorret_t networksocketDolphinDisconnect(networksocket_t *socket);
|
||||
|
||||
/**
|
||||
* Closes the file descriptor if still open (idempotent).
|
||||
*/
|
||||
errorret_t networksocketDolphinDispose(networksocket_t *socket);
|
||||
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "networksocketdolphin.h"
|
||||
|
||||
#define networksocketPlatformInit networksocketDolphinInit
|
||||
#define networksocketPlatformConnect networksocketDolphinConnect
|
||||
#define networksocketPlatformSend networksocketDolphinSend
|
||||
#define networksocketPlatformRecv networksocketDolphinRecv
|
||||
#define networksocketPlatformDisconnect networksocketDolphinDisconnect
|
||||
#define networksocketPlatformDispose networksocketDolphinDispose
|
||||
|
||||
typedef networksocketdolphin_t networksocketplatform_t;
|
||||
Reference in New Issue
Block a user