使QTcpServer仅接受IPv4连接

时间:2014-08-12 14:44:56

标签: c++ qt qtcpserver

我正在实施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连接呢?

1 个答案:

答案 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_INETAF_INET6

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

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