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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user