使用WebSocketpp启用了Websocketpp接受连接的问题

Issue with accepting connection using websocketpp with firewall enabled

本文关键字:连接 问题 Websocketpp WebSocketpp 启用 使用      更新时间:2023-10-16

这个问题是我遇到的前5个最奇怪的事情。所以请忍受我。

我正在使用UFW防火墙运行Arch Linux(截至2017-03-09起最新)。

启用防火墙后,我无法再连接到基于WebSocketpp的应用程序。不,我没有阻止所涉及的端口。

实际上,如果我禁用防火墙,我在重新启动整个计算机之前仍然无法连接(仅重新启动相关的应用程序无济于事)。

,UFW也允许Localhost上的所有流量

我也在WebSocketpp存储库中验证了示例Echo服务器的问题。

检查我的应用程序是否在端口9002

上收听
sudo netstat -lnp | grep 900
tcp6       0      0 :::9002                 :::*                    LISTEN      12695/./bin/echo_se 

在这里,我们可以看到Echo服务器已绑定到IPv6。但是更改为IPv4无济于事。已经尝试了。

带有DEBUG的Echo服务器的输出

[2017-03-09 11:38:06] [devel] endpoint constructor
[2017-03-09 11:38:06] [devel] server constructor
[2017-03-09 11:38:06] [devel] asio::init_asio
[2017-03-09 11:38:06] [devel] set_message_handler
[2017-03-09 11:38:06] [devel] asio::listen
[2017-03-09 11:38:06] [devel] create_connection
[2017-03-09 11:38:06] [devel] asio con transport constructor
[2017-03-09 11:38:06] [devel] connection constructor
[2017-03-09 11:38:06] [devel] transport::asio::init
[2017-03-09 11:38:06] [devel] asio::async_accept

我正在使用telnet尝试连接(因为此时我只关心TCP握手

telnet localhost 9002
Trying ::1...
(eventually timeout)

,如果我关闭了Echo服务器,因此没有任何应用程序再收听了。然后我得到(预期的)

telnet localhost 9002
Trying ::1...
Connection failed: Connection refused
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

所以,现在的操作系统通知没有人在收听并发送连接被拒绝。

和UWF规则:

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
22                         ALLOW       Anywhere                          
7000:8000/udp              ALLOW       Anywhere                  
7000:8000/tcp              ALLOW       Anywhere                  
9000:9500/tcp              ALLOW       Anywhere                  
9002                       ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)                    
7000:8000/tcp (v6)         ALLOW       Anywhere (v6)             
9000:9500/tcp (v6)         ALLOW       Anywhere (v6)             
9002 (v6)                  ALLOW       Anywhere (v6)             

我还应该提到其他服务器。例如,我在同一端口上尝试过的最小Boost ASIO Telnet服务器,基于ZMQ的服务器等。

所以,我认为这一定是WebSocketpp的东西,但我不明白它可能是什么。由于TCP握手在应用级别以下执行。

,这是不可能的。

目前对任何想法都表示赞赏。

完整性。禁用UFW并重新启动后,我会从Echo服务器中获得此信息:

2017-03-09 11:49:17] [devel] endpoint constructor
[2017-03-09 11:49:17] [devel] server constructor
[2017-03-09 11:49:17] [devel] asio::init_asio
[2017-03-09 11:49:17] [devel] set_message_handler
[2017-03-09 11:49:17] [devel] asio::listen
[2017-03-09 11:49:17] [devel] create_connection
[2017-03-09 11:49:17] [devel] asio con transport constructor
[2017-03-09 11:49:17] [devel] connection constructor
[2017-03-09 11:49:17] [devel] transport::asio::init
[2017-03-09 11:49:17] [devel] asio::async_accept
[2017-03-09 11:49:23] [devel] asio::handle_accept
[2017-03-09 11:49:23] [devel] connection start
[2017-03-09 11:49:23] [devel] asio connection init
[2017-03-09 11:49:23] [devel] asio connection handle pre_init
[2017-03-09 11:49:23] [devel] asio connection post_init
[2017-03-09 11:49:23] [devel] asio connection handle_post_init
[2017-03-09 11:49:23] [devel] connection handle_transport_init
[2017-03-09 11:49:23] [devel] connection read_handshake
[2017-03-09 11:49:23] [devel] asio async_read_at_least: 1
[2017-03-09 11:49:23] [devel] create_connection
[2017-03-09 11:49:23] [devel] asio con transport constructor
[2017-03-09 11:49:23] [devel] connection constructor
[2017-03-09 11:49:23] [devel] transport::asio::init
[2017-03-09 11:49:23] [devel] asio::async_accept
[2017-03-09 11:49:23] [devel] asio post init timer cancelled

telnet中的此:

telnet localhost 9002
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

所以一切都起作用。

和"在sudo ufw启用& sudo ufw disable之后"它不再起作用...

好,在调试两天后(我写了问题,然后今天)我找到了它。

这是侦听()调用OS的积压参数为0。

为什么加载iptables的行为是不同的,对我来说是个谜。

这篇文章表明,即使设置为0时,积压也应该是最小的16个,也许(这是我猜测)iptables加载了内核不再填写积压参数,而0使其"不起作用"。我能理解的是,由于0的队列没有道理。

无论如何。将积压设置为64解决了我的问题。

websocketPpServerObject.set_listen_backlog(64);

也请参见此GitHub线程,如果您对更多详细信息感兴趣。