c++ - 使 QTcpServer 只接受 IPv4 连接

标签 c++ qt qtcpserver

我正在实现一个 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_INETAF_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/

相关文章:

qt - 使用 Qt 4.5/4.6 加载 OpenGL 线程平铺纹理

javascript - Qt QWebEngineView 在发布中但在调试中找不到 javascript 文件

c++ - QTcpServer/QTcpSocket : Using a QDataStream vs. 直接发送UTF-8数据

c++ - Qt,从客户端发送多种数据类型到服务器+数据流

python - PyQt QTcpServer : How to return data to multiple clients?

c++ - ASIO 试图引用一个已删除的函数

php - 哪种沟通方式更有效

c++ - 错误在 `./2' : free(): invalid pointer: 0x000000000096044c *** Aborted (core dumped)

java - 如何使用 JNI 在 C++ 中设置类成员

c++ - 如何访问 Qt::DisplayRole 并在 TableView 中指定列