Links2004 / arduinoWebSockets

arduinoWebSockets
GNU Lesser General Public License v2.1
1.88k stars 556 forks source link

Async - _reconnectInterval is not Implemented - Reconnection flood after connection closed #404

Open leventesen opened 5 years ago

leventesen commented 5 years ago

In async mode, Reconnect interval is set to 60000, WebSocketsClient is used, What I want is to terminate unauthorized connections in server side. When I terminate or close the connection then WebSocketsClient reconnects immediately like a loop or flood.

[WS-Server] Server Started.
[WS-Client] asyncConnect...
scandone
state: 0 -> 2 (b0)
[WS-Client] connection to 192.168.2.161:8081 Faild
[WS-Client] asyncConnect...
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt

connected with SUPERONLINE_Wi-Fi_5951, channel 8
ip:192.168.2.12,mask:255.255.255.0,gw:192.168.2.1
[WS-Client] connection to 192.168.2.161:8081 Faild
[WS-Client] asyncConnect...
[WS-Client] connection to 192.168.2.161:8081 Faild
[WS-Client] asyncConnect...
[WS-Client] connection to 192.168.2.161:8081 Faild
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: KTNx+wgZwI5KeImh5FlaWQ==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (24014us).
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: miCTQdM2HDv/jGwgHNVx2JcTlyg=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: KTNx+wgZwI5KeImh5FlaWQ==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: miCTQdM2HDv/jGwgHNVx2JcTlyg=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2333us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1568us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: MxstlMW1yVJQp3myoK3Qaw==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (23955us).
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: pjpu9WdZvibueOj/ZiRweFwZ6K0=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: MxstlMW1yVJQp3myoK3Qaw==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: pjpu9WdZvibueOj/ZiRweFwZ6K0=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2421us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1551us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: yQzUV073YgXl/ofwqCSWFA==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (24003us).
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: 2duEog11Fk5KIslDZFsqlwVPzsQ=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: yQzUV073YgXl/ofwqCSWFA==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: 2duEog11Fk5KIslDZFsqlwVPzsQ=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2378us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1555us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: BBzaYnWcFaLQDDfu7Lx6ZQ==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (23978us).
[WS][0][sendFrame] not in WSC_CONNECTED state!?
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: xVTj/FPEluKnnvNOYzHOouFLgDI=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: BBzaYnWcFaLQDDfu7Lx6ZQ==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: xVTj/FPEluKnnvNOYzHOouFLgDI=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2419us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1563us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: 0bmRoQUeWNZy4xgjNqItFA==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (23921us).
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: v7kfeCMXA3sUGAuXP5+c4Z+HYCI=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: 0bmRoQUeWNZy4xgjNqItFA==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: v7kfeCMXA3sUGAuXP5+c4Z+HYCI=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2377us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1559us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
[WS-Client] connected to 192.168.2.161:8081.
[WS-Client][sendHeader] sending header...
[WS-Client][sendHeader] handshake GET / HTTP/1.1

Host: 192.168.2.161:8081

Connection: Upgrade

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: 6L1NVLOVSIDC9zlblD1jWg==

Sec-WebSocket-Protocol: arduino

User-Agent: arduino-WebSocket-Client

Authorization: base64_crypto_key

[write] n: zu t: 262
[WS-Client][sendHeader] sending header... Done (24010us).
[WS-Client][handleHeader] RX: HTTP/1.1 101 Switching Protocols
[WS-Client][handleHeader] RX: Upgrade: websocket
[WS-Client][handleHeader] RX: Connection: Upgrade
[WS-Client][handleHeader] RX: Sec-WebSocket-Accept: HMGC+2I9gBs18mxKRkASuog23xQ=
[WS-Client][handleHeader] RX: Sec-WebSocket-Protocol: arduino
[WS-Client][handleHeader] Header read fin.
[WS-Client][handleHeader] Client settings:
[WS-Client][handleHeader]  - cURL: /
[WS-Client][handleHeader]  - cKey: 6L1NVLOVSIDC9zlblD1jWg==
[WS-Client][handleHeader] Server header:
[WS-Client][handleHeader]  - cCode: 101
[WS-Client][handleHeader]  - cIsUpgrade: 1
[WS-Client][handleHeader]  - cIsWebsocket: 1
[WS-Client][handleHeader]  - cAccept: HMGC+2I9gBs18mxKRkASuog23xQ=
[WS-Client][handleHeader]  - cProtocol: arduino
[WS-Client][handleHeader]  - cExtensions:
[WS-Client][handleHeader]  - cVersion: 0
[WS-Client][handleHeader]  - cSessionId:
[WS-Client][handleHeader] Websocket connection init done.
[WS][0][headerDone] Header Handling Done.
[WS][0][handleWebsocketWaitFor] size: 2 cWsRXsize: 0
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 25 headerToPayload: 0
[WS][0][sendFrame] text: [5,"1234-5678-1234-5678"]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 31
[WS][0][sendFrame] sending Frame Done (2413us).
[WS][0][sendFrame] ------- send message frame -------
[WS][0][sendFrame] fin: 1 opCode: 1 mask: 1 length: 93 headerToPayload: 0
[WS][0][sendFrame] text: [4,"Kulucka Makinasi","1234",132317185,21,0,377,2,60,5,0,0,390,350,75,50,0,70,70,0,0,10,3600]
[WS][0][sendFrame] pack to one TCP package...
[write] n: zu t: 99
[WS][0][sendFrame] sending Frame Done (1562us).
[WS-Server][0] Disconnect client
[WS-Client] asyncConnect...
Links2004 commented 5 years ago

the reconnect interval setting is not implemented for async right now.

nouser2013 commented 5 years ago

Hmmm, observing the same thing for synchronous version. According to your code, this shouldn't happen.

But, when the server OS correctly reports an RST after ESP32 SYN's, I see immediate SYN flooding in wireshark. It does not matter if the WS server is not running in the first place or is terminated after WS connection was established.

I set the reconnect interval to 5000 after begin().

In my understanding, each call of .loop() will try to open a TCP connection, regardless of elapsed time since last failed attempt. Is there a way to debug this?

EDIT#1: After adding an appropriate Serial.print() to WebSocketsClient.cpp#136, I observe that _lastConnectionFail is always 0, _reconnectInterval is correctly set to 5000.

EDIT#2: got it _client.tcp->connect(_host.c_str(), _port) apparently returns non-zero, even if connection was rejected via server RST. As this seems to go deep down into the tcp code basement, I don't know how to continue from here.

Links2004 commented 5 years ago

ok looks like a ESP32 TCP stack problem then.

you can try to check the result of the lwip_connect_r call here: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiClient.cpp#L229

for some reason the return value there is not checked which makes no sense to me right now.

    if(lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0) {
        log_e("lwip_connect_r: %d",errno);
        close(sockfd);
        return 0;
   }
    int res = select(sockfd + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv);
    if (res != 1)
    {
        log_e("select: %d",errno);
        close(sockfd);
        return 0;
    }

for reverence:

https://github.com/espressif/esp-lwip/blob/e6f0cab39b3831bd56e83615fd65851294ca6ed4/src/api/sockets.c#L3447 https://github.com/espressif/esp-lwip/blob/e6f0cab39b3831bd56e83615fd65851294ca6ed4/src/api/sockets.c#L886

nouser2013 commented 5 years ago

ok looks like a ESP32 TCP stack problem then. you can try to check the result of the lwip_connect_r call here: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiClient.cpp#L229

Hi, just tried your patch - this seems to work, partially. Even with ws.loop() called in each Arduino-Loop, there is now only one attempt every 5 seconds, behaviour as expected.

But now I don't seem to be able to open a regular connection. For some reason, now the ESP32 will RST the connection. Meaning with a running server on the PC on the correct port, this pattern repeats every 5 seconds:

  1. ESP -> PC [SYN]
  2. PC -> ESP [SYN, ACK]
  3. ESP -> PC [RST, ACK]

So, my workaround is still a ticker setting a flag every 5 seconds. I can only process one message this way, but better than SYN flooding.