|
@@ -45,6 +45,27 @@ static size_t _set_listen_sockaddr(struct sockaddr_storage* p_addr, int p_port,
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+static int _socket_create(IP_Address::AddrType p_type, int type, int protocol) {
|
|
|
+
|
|
|
+ ERR_FAIL_COND_V(p_type > IP_Address::TYPE_ANY || p_type < IP_Address::TYPE_NONE, ERR_INVALID_PARAMETER);
|
|
|
+
|
|
|
+ int family = p_type == IP_Address::TYPE_IPV4 ? AF_INET : AF_INET6;
|
|
|
+ int sockfd = socket(family, type, protocol);
|
|
|
+
|
|
|
+ ERR_FAIL_COND_V( sockfd == -1, -1 );
|
|
|
+
|
|
|
+ if(family == AF_INET6) {
|
|
|
+ // Ensure IPv4 over IPv6 is enabled
|
|
|
+ int v6_only = 0;
|
|
|
+ if(setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&v6_only, sizeof(v6_only)) != 0) {
|
|
|
+ WARN_PRINT("Unable to set IPv4 address mapping over IPv6");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return sockfd;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void _set_ip_addr_port(IP_Address& r_ip, int& r_port, struct sockaddr_storage* p_addr) {
|
|
|
|
|
|
if (p_addr->ss_family == AF_INET) {
|