C++ 使QTcpServer仅接受IPv4连接

C++ 使QTcpServer仅接受IPv4连接,c++,qt,qtcpserver,C++,Qt,Qtcpserver,我正在实现一个FTP服务器,但它还不支持IPv6(IPv6连接不能使用端口和PASV,它们需要使用EPRT和EPSV来指定数据连接) 因此,我只需要接受来自QTcpServer的IPv4连接。现在我开始听下面的代码: server->listen(QHostAddress::Any, port); QHostAddress::Any应该是IPv4 Any地址,但是当我指定localhost而不是127.0.0.1时,Filezilla仍然能够使用IPv6进行连接。我认为QHostAddr

我正在实现一个FTP服务器,但它还不支持IPv6(IPv6连接不能使用端口和PASV,它们需要使用EPRT和EPSV来指定数据连接)

因此,我只需要接受来自QTcpServer的IPv4连接。现在我开始听下面的代码:

server->listen(QHostAddress::Any, port);
QHostAddress::Any应该是IPv4 Any地址,但是当我指定localhost而不是127.0.0.1时,Filezilla仍然能够使用IPv6进行连接。我认为QHostAddress::Any意味着只接受IPv4传入连接,但情况显然不是这样


那么如何禁用IPv6连接呢?

在Qt4中,QHostAddress::Any仅用于侦听IPv4,但从Qt5起,它现在侦听所有可用接口

如果要在Qt4和Qt5下编译,代码应如下所示:

#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
    server->listen(QHostAddress::AnyIPv4, port);
#else
    server->listen(QHostAddress::Any, port);
#endif
正如上面所说:

QHostAddress::双堆栈中的任意地址。与此绑定的套接字 地址将在IPv4和IPv6接口上侦听

基于您应该使用的参考

QHostAddress::AnyIPv4
QHostAddress::AnyIPv4 IPv4指定IPv4的任意地址。相当于 QHostAddress(“0.0.0.0”)。与此地址绑定的套接字将侦听 仅在IPv4间隔上


旁注: 它在引擎盖下的作用是创建正确版本的插座,即
AF_INET
AF_INET6

int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);

int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);