我正在实现一个 FTP 服务器,它还不支持 IPv6(IPv6 连接不能使用 PORT 和 PASV,它们需要使用 EPRT 和 EPSV 来代替指定数据连接)。
所以我只需要接受来 self 的 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说:
QHostAddress::Any The dual stack any-address. A socket bound with this address will listen on both IPv4 and IPv6 interfaces.
基于QTcpServer你应该使用的引用
QHostAddress::AnyIPv4
QHostAddress::AnyIPv4 The IPv4 any-address. Equivalent to QHostAddress("0.0.0.0"). A socket bound with this address will listen only on IPv4 interaces.
边注:
它在幕后所做的是创建正确版本的套接字,即 AF_INET
或 AF_INET6
:
int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);
int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);
关于c++ - 使 QTcpServer 只接受 IPv4 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25267308/