Core: Add UNIX domain socket support

> [!NOTE]
>
> Later versions of Windows has support for `AF_UNIX`, so it could be
> added.
This commit is contained in:
Stuart Carnie
2025-06-25 07:01:29 +10:00
parent a078895ad2
commit 7227fdd805
39 changed files with 1791 additions and 529 deletions

View File

@@ -217,7 +217,8 @@ void NetSocketWinSock::_set_socket(SOCKET p_sock, IP::Type p_ip_type, bool p_is_
_is_stream = p_is_stream;
}
Error NetSocketWinSock::open(Type p_sock_type, IP::Type &ip_type) {
Error NetSocketWinSock::open(Family p_family, Type p_sock_type, IP::Type &ip_type) {
ERR_FAIL_COND_V(p_family != Family::INET, ERR_UNAVAILABLE);
ERR_FAIL_COND_V(is_open(), ERR_ALREADY_IN_USE);
ERR_FAIL_COND_V(ip_type > IP::TYPE_ANY || ip_type < IP::TYPE_NONE, ERR_INVALID_PARAMETER);
@@ -275,12 +276,13 @@ void NetSocketWinSock::close() {
_is_stream = false;
}
Error NetSocketWinSock::bind(IPAddress p_addr, uint16_t p_port) {
Error NetSocketWinSock::bind(Address p_addr) {
ERR_FAIL_COND_V(!p_addr.is_inet(), ERR_UNAVAILABLE);
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
ERR_FAIL_COND_V(!_can_use_ip(p_addr, true), ERR_INVALID_PARAMETER);
ERR_FAIL_COND_V(!_can_use_ip(p_addr.ip(), true), ERR_INVALID_PARAMETER);
sockaddr_storage addr;
size_t addr_size = _set_addr_storage(&addr, p_addr, p_port, _ip_type);
size_t addr_size = _set_addr_storage(&addr, p_addr.ip(), p_addr.port(), _ip_type);
if (::bind(_sock, (struct sockaddr *)&addr, addr_size) != 0) {
NetError err = _get_socket_error();
@@ -305,12 +307,13 @@ Error NetSocketWinSock::listen(int p_max_pending) {
return OK;
}
Error NetSocketWinSock::connect_to_host(IPAddress p_host, uint16_t p_port) {
Error NetSocketWinSock::connect_to_host(Address p_addr) {
ERR_FAIL_COND_V(!p_addr.is_inet(), ERR_UNAVAILABLE);
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
ERR_FAIL_COND_V(!_can_use_ip(p_host, false), ERR_INVALID_PARAMETER);
ERR_FAIL_COND_V(!_can_use_ip(p_addr.ip(), false), ERR_INVALID_PARAMETER);
struct sockaddr_storage addr;
size_t addr_size = _set_addr_storage(&addr, p_host, p_port, _ip_type);
size_t addr_size = _set_addr_storage(&addr, p_addr.ip(), p_addr.port(), _ip_type);
if (::WSAConnect(_sock, (struct sockaddr *)&addr, addr_size, nullptr, nullptr, nullptr, nullptr) != 0) {
NetError err = _get_socket_error();
@@ -567,7 +570,7 @@ int NetSocketWinSock::get_available_bytes() const {
return len;
}
Error NetSocketWinSock::get_socket_address(IPAddress *r_ip, uint16_t *r_port) const {
Error NetSocketWinSock::get_socket_address(Address *r_addr) const {
ERR_FAIL_COND_V(!is_open(), FAILED);
struct sockaddr_storage saddr;
@@ -577,11 +580,16 @@ Error NetSocketWinSock::get_socket_address(IPAddress *r_ip, uint16_t *r_port) co
print_verbose("Error when reading local socket address.");
return FAILED;
}
_set_ip_port(&saddr, r_ip, r_port);
IPAddress ip;
uint16_t port = 0;
_set_ip_port(&saddr, &ip, &port);
if (r_addr) {
*r_addr = Address(ip, port);
}
return OK;
}
Ref<NetSocket> NetSocketWinSock::accept(IPAddress &r_ip, uint16_t &r_port) {
Ref<NetSocket> NetSocketWinSock::accept(Address &r_addr) {
Ref<NetSocket> out;
ERR_FAIL_COND_V(!is_open(), out);
@@ -594,7 +602,10 @@ Ref<NetSocket> NetSocketWinSock::accept(IPAddress &r_ip, uint16_t &r_port) {
return out;
}
_set_ip_port(&their_addr, &r_ip, &r_port);
IPAddress ip;
uint16_t port = 0;
_set_ip_port(&their_addr, &ip, &port);
r_addr = Address(ip, port);
NetSocketWinSock *ns = memnew(NetSocketWinSock);
ns->_set_socket(fd, _ip_type, _is_stream);

View File

@@ -70,21 +70,21 @@ public:
static void _set_ip_port(struct sockaddr_storage *p_addr, IPAddress *r_ip, uint16_t *r_port);
static size_t _set_addr_storage(struct sockaddr_storage *p_addr, const IPAddress &p_ip, uint16_t p_port, IP::Type p_ip_type);
virtual Error open(Type p_sock_type, IP::Type &ip_type) override;
virtual Error open(Family p_family, Type p_sock_type, IP::Type &ip_type) override;
virtual void close() override;
virtual Error bind(IPAddress p_addr, uint16_t p_port) override;
virtual Error bind(Address p_addr) override;
virtual Error listen(int p_max_pending) override;
virtual Error connect_to_host(IPAddress p_host, uint16_t p_port) override;
virtual Error connect_to_host(Address p_addr) override;
virtual Error poll(PollType p_type, int timeout) const override;
virtual Error recv(uint8_t *p_buffer, int p_len, int &r_read) override;
virtual Error recvfrom(uint8_t *p_buffer, int p_len, int &r_read, IPAddress &r_ip, uint16_t &r_port, bool p_peek = false) override;
virtual Error send(const uint8_t *p_buffer, int p_len, int &r_sent) override;
virtual Error sendto(const uint8_t *p_buffer, int p_len, int &r_sent, IPAddress p_ip, uint16_t p_port) override;
virtual Ref<NetSocket> accept(IPAddress &r_ip, uint16_t &r_port) override;
virtual Ref<NetSocket> accept(Address &r_addr) override;
virtual bool is_open() const override;
virtual int get_available_bytes() const override;
virtual Error get_socket_address(IPAddress *r_ip, uint16_t *r_port) const override;
virtual Error get_socket_address(Address *r_addr) const override;
virtual Error set_broadcasting_enabled(bool p_enabled) override;
virtual void set_blocking_enabled(bool p_enabled) override;