Skip to content

Server closes connection after client shuts down the sending side of its socket #2569

@chschu

Description

@chschu

Basic Infos

Hardware

Hardware: ESP-12F on NodeMCU clone (Geekcreit Doit)
Core Version: 2.3.0

Description

A WiFiClient instance (or the underlying TCP/IP lib) obtained from WiFiServer::available() seems to close the TCP connection when it receives a FIN packet. According to the TCP spec, it should go to the CLOSE_WAIT state, which would still allow data to be sent in the opposite direction.

This happens if a client connects to a server running on the ESP, sends some data and shuts down the writing side of the socket before receiving a response. The client socket's reading side is still open in this case, and the server should be able to send a response to the client.

This issue also occurs with ESP8266WebServer, because it uses WiFiServer/Client.

Settings in IDE

Module: NodeMCU 1.0 (ESP-12E Module)
Flash Size: 4MB (3M SPIFFS)
CPU Frequency: 80Mhz
Upload Using: SERIAL

Sketch

#include "ESP8266WiFi.h" #define WIFI_SSID "..." #define WIFI_PASS "..." WiFiServer server(1400); void setup() { Serial.begin(115200); delay(10); WiFi.begin(WIFI_SSID, WIFI_PASS); Serial.print("Connecting to WiFi."); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("OK"); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { Serial.printf("status before delay: %d\n", client.status()); delay(1000); client.write("Hello, World!\n"); Serial.printf("status after delay: %d\n", client.status()); client.stop(); Serial.printf("status after stop: %d\n", client.status()); } }

Debug Messages

Client that shuts down the sending side immediately

Shell command:

sleep 0 | nc 192.168.178.42 1400 

(sending side is shut down immediately, because input pipe of netcat is closed after sleep 0)

Client output:

<nothing> 

Serial output:

status before delay: 4 status after delay: 0 status after stop: 0 

(4 is ESTABLISHED, 0 is CLOSED)

Wireshark capture:
screen shot 2016-10-02 at 15 03 01

Client that waits for the server to close the connection (works correctly)

Shell command:

sleep 2 | nc 192.168.178.42 1400 

(this gives the server enough time to respond and close the connection)

Client output:

Hello, World! 

Serial output:

status before delay: 4 status after delay: 4 status after stop: 0 

(4 is ESTABLISHED, 0 is CLOSED)

Wireshark capture:
screen shot 2016-10-02 at 15 02 01

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions