我正在实施FTP服务器,它还不支持IPv6(IPv6连接不能使用PORT和PASV,他们需要使用EPRT和EPSV来指定数据连接)。
所以我只需要接受来自QTcpServer的IPv4连接。现在我开始用这段代码听:
server->listen(QHostAddress::Any, port);
QHostAddress ::任何应该是IPv4 any-address,但是当我指定localhost而不是127.0.0.1时,Filezilla仍然设法使用IPv6进行连接。我认为QHostAddress :: Any意味着只接受IPv4传入连接,但事实并非如此。
那么如何禁用IPv6连接呢?
答案 0 :(得分:8)
在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 reference所说:
QHostAddress :: Any双栈任意地址。一个与此绑定的套接字 地址将侦听IPv4和IPv6接口。
基于QTcpServer引用,您应该使用
QHostAddress::AnyIPv4
QHostAddress :: AnyIPv4 IPv4 any-address。相当于 QHostAddress(" 0.0.0.0&#34)。绑定此地址的套接字将侦听 仅在IPv4上相互作用。
旁注:
它所做的是创建正确版本的套接字,即AF_INET
或AF_INET6
:
int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);
int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);