浏览代码

Socket helpers now fall back to ipv4 on systems where ipv6 is disabled.

(cherry picked from commit 020f6a7f2082a6039ce6a5b4410dce47f6ea2607)
Fabio Alessandrelli 8 年之前
父节点
当前提交
0dc62633e6
共有 1 个文件被更改,包括 9 次插入1 次删除
  1. 9 1
      drivers/unix/socket_helpers.h

+ 9 - 1
drivers/unix/socket_helpers.h

@@ -71,13 +71,21 @@ static size_t _set_listen_sockaddr(struct sockaddr_storage *p_addr, int p_port,
 	};
 };
 
-static int _socket_create(IP::Type p_type, int type, int protocol) {
+static int _socket_create(IP::Type &p_type, int type, int protocol) {
 
 	ERR_FAIL_COND_V(p_type > IP::TYPE_ANY || p_type < IP::TYPE_NONE, ERR_INVALID_PARAMETER);
 
 	int family = p_type == IP::TYPE_IPV4 ? AF_INET : AF_INET6;
 	int sockfd = socket(family, type, protocol);
 
+	if (sockfd == -1 && p_type == IP::TYPE_ANY) {
+		// Careful here, changing the referenced parameter so the caller knows that we are using an IPv4 socket
+		// in place of a dual stack one, and further calls to _set_sock_addr will work as expected.
+		p_type = IP::TYPE_IPV4;
+		family = AF_INET;
+		sockfd = socket(family, type, protocol);
+	}
+
 	ERR_FAIL_COND_V(sockfd == -1, -1);
 
 	if (family == AF_INET6) {