我正在实现一个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_INET
或AF_INET6
:int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);
int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);