3

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

所以我只需要接受来自我的 QTcpServer 的 IPv4 连接。现在我开始听这段代码:

server->listen(QHostAddress::Any, port);

QHostAddress::Any 应该是 IPv4 任意地址,但当我指定 localhost 而不是 127.0.0.1 时,Filezilla 仍然设法使用 IPv6 进行连接。我认为 QHostAddress::Any 意味着只接受 IPv4 传入连接,但显然情况并非如此。

那么如何禁用 IPv6 连接呢?

4

1 回答 1

9

在 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

正如Qt5 参考所说:

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

根据您应该使用的QTcpServer参考

QHostAddress::AnyIPv4

QHostAddress::AnyIPv4 IPv4 任意地址。等效于 QHostAddress("0.0.0.0")。与此地址绑定的套接字将仅侦听 IPv4 接口。


旁注:它在引擎盖下所做的是创建正确版本的套接字,即AF_INETAF_INET6

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

int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);
于 2014-08-12T15:04:34.437 回答