使QTcpServer只接受IPv4连接

Make QTcpServer accept only IPv4 connections

本文关键字:IPv4 连接 QTcpServer      更新时间:2023-10-16

我正在实现一个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开始,它现在监听所有可用的接口。

如果您想在Qt4和Qt5下编译,您的代码应该是这样的:

#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
    server->listen(QHostAddress::AnyIPv4, port);
#else
    server->listen(QHostAddress::Any, port);
#endif

正如Qt5参考所说:

QHostAddress::Any双栈Any -address。与此绑定的套接字address将同时监听IPv4和IPv6接口。

基于QTcpServer引用,您应该使用

QHostAddress::AnyIPv4

QHostAddress::AnyIPv4 IPv4任意地址。相当于QHostAddress("0.0.0.0")。绑定此地址的套接字将监听


注:它在底层做的是创建正确版本的套接字,即AF_INETAF_INET6:

int ipv4sockfd = socket( AF_INET, SOCK_STREAM, 0);
int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);