我正在实现一个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连接呢?

最佳答案

在Qt4中,QHostAddress::Any仅用于监听IPv4,但是从Qt5开始,它现在在所有可用接口(interface)上监听。

如果要同时在Qt4和Qt5下进行编译,则代码应如下所示:

#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
    server->listen(QHostAddress::AnyIPv4, port);
#else
    server->listen(QHostAddress::Any, port);
#endif

正如Qt5 reference所说:



根据QTcpServer引用,您应该使用
QHostAddress::AnyIPv4



边注:
它在后台执行的操作是创建正确版本的套接字,即AF_INETAF_INET6:
int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);

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

09-15 17:18