Closed
Description
The test program works on ESP8266 but fails on ESP32. The code below listens on TCP port 9 and discards all incoming data. On a Linux box, use netcat (nc 9) to connect to the ESP. Pressing ^C stops netcat and terminates the TCP socket. On ESP32, the sketch never detects the remote TCP disconnect. On ESP8266, remote TCP disconnects are detected correctly.
BTW, the ESP32 TCP Rx performance is much slower than the ESP8266 but perhaps the Rx window size needs tweaking or something. I will open another issue if this is a real problem.
/*
* Simple network performance tests. Works on ESP8266 but TBD for ESP32.
*
* == Listens on port 9 and discards all incoming data. Performance
* in bits/sec reported.
*
*/
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#else
#include <WiFi.h>
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#endif
#define DISCARD_PORT (9)
WiFiServer tcpDiscardServer(DISCARD_PORT);
WiFiClient tcpDiscardClient; // Service at most 1 client
typedef struct scoreboard_t {
uint64_t byteCount;
uint32_t startMillis;
} scoreboard_t;
scoreboard_t DiscardScore;
#ifndef min
#define min(x,y) (((x) < (y)) ? (x) : (y))
#endif
#ifndef max
#define max(x,y) (((x) > (y)) ? (x) : (y))
#endif
char discard[4*1460];
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
//wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
//wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
Serial.println("Connecting Wifi ");
for (int loops = 10; loops > 0; loops--) {
if (wifiMulti.run() == WL_CONNECTED) {
Serial.println("");
Serial.print("WiFi connected ");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
break;
}
else {
Serial.println(loops);
delay(1000);
}
}
if (wifiMulti.run() != WL_CONNECTED) {
Serial.println("WiFi connect failed");
delay(1000);
ESP.restart();
}
tcpDiscardServer.begin();
#ifdef ESP8266
tcpDiscardServer.setNoDelay(true);
#endif
Serial.print("DISCARD daemon listening on port "); Serial.println(DISCARD_PORT);
}
void loop() {
if (wifiMulti.run() == WL_CONNECTED) {
WiFiClient newClient = tcpDiscardServer.available();
if (newClient) {
newClient.setNoDelay(true);
if (!tcpDiscardClient || !tcpDiscardClient.connected()) {
if (tcpDiscardClient) tcpDiscardClient.stop();
tcpDiscardClient = newClient;
Serial.print("New client: "); Serial.println(tcpDiscardClient.remoteIP());
DiscardScore.byteCount = 0;
DiscardScore.startMillis = millis();
}
else {
// client connected so refuse new client
newClient.stop();
}
}
//check client for data
if (tcpDiscardClient) {
if (tcpDiscardClient.connected()) {
int bytesAvail, bytesIn, bytesRead;
while ((bytesAvail = tcpDiscardClient.available()) > 0) {
bytesIn = min(sizeof(discard), bytesAvail);
if (bytesIn < bytesAvail) Serial.println("Embiggen discard[]?");
bytesRead = tcpDiscardClient.readBytes(discard, bytesIn);
if (bytesRead != bytesIn) Serial.println("readBytes() not cromulent");
DiscardScore.byteCount += bytesRead;
}
}
else {
uint32_t deltaMillis = millis() - DiscardScore.startMillis;
Serial.println("Discard client disconnect");
Serial.printf("Bytes %u, %u ms, %u bits/s\n",
(uint32_t)DiscardScore.byteCount, deltaMillis,
(uint32_t)((DiscardScore.byteCount * 8000ULL) / deltaMillis));
tcpDiscardClient.stop();
}
}
}
else {
Serial.println("WiFi not connected!");
if (tcpDiscardClient) tcpDiscardClient.stop();
delay(1000);
}
}
Metadata
Metadata
Assignees
Labels
No labels