使QTcpServer仅接受IPv4连接

sas*_*alm 3 c++ qt qtcpserver

我正在实现一个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连接?

4pi*_*ie0 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
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_INETAF_INET6:

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

int ipv6sockfd = socket( AF_INET6, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)