我正在实现一个FTP服务器,它还不支持IPv6(IPv6连接不能使用PORT和PASV,它们需要使用EPRT和EPSV来指定数据连接).
所以我只需要接受来自QTcpServer的IPv4连接.现在我开始用这段代码听:
server->listen(QHostAddress::Any, port);
Run Code Online (Sandbox Code Playgroud)
QHostAddress :: Any应该是IPv4 any-address,但是当我指定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
Run Code Online (Sandbox Code Playgroud)
正如Qt5参考文献所述:
QHostAddress :: Any双栈任意地址.与此地址绑定的套接字将侦听IPv4和IPv6接口.
基于QTcpServer参考,您应该使用
QHostAddress::AnyIPv4
Run Code Online (Sandbox Code Playgroud)
QHostAddress :: AnyIPv4 IPv4 any-address.相当于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);
Run Code Online (Sandbox Code Playgroud)