Description
When using the WiFiClient library as follows:
#include <ESP8266WiFi.h>
#define MY_SSID "ssid"
#define MY_WFPASSWORD "wpa2_key"
WiFiClient client;
void setup() {
WiFi.begin(MY_SSID, MY_WFPASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(50);
}
client.connect(HOST, HTTPPORT);
}
The source port utilized is always "patrolview" or 4097.
This can create a deadly embrace situation if the device is being used to log data and resets itself as a means to try again without delay on certain connection errors. It should be randomized so that a different port is used for each call to connect, even if the device is reset/rebooted between calls.
The problem that can occur is a web server which is in one of the wait states for closing on a previous attempt will see the new attempt to connect as matching the previous one since the SRC_ADDR,SRC_PORT,DST_ADDR,DST_PORT tuple is identical. This results in a retransmission of the previous FIN packet and a reset of the wait timer on the server side. So long as the ESP8266 continues to retry within before the timer expires (often these are ~5 minutes or so), it will be unable to initiate a new connection to the server without being mistaken for the old one.
The simplest solution is to ad code to WiFiClient::connect() that will randomize the local port number.
I will attempt to provide a workable patch shortly.