- Notifications
You must be signed in to change notification settings - Fork 7.8k
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. * */#ifdefESP8266#include<ESP8266WiFi.h>#include<ESP8266WiFiMulti.h>ESP8266WiFiMultiwifiMulti; #else#include<WiFi.h>#include<WiFiMulti.h>WiFiMultiwifiMulti; #endif#defineDISCARD_PORT (9) WiFiServertcpDiscardServer(DISCARD_PORT); WiFiClienttcpDiscardClient; // Service at most 1 clienttypedefstructscoreboard_t{uint64_tbyteCount; uint32_tstartMillis} scoreboard_t; scoreboard_tDiscardScore; #ifndefmin#definemin(x,y) (((x) < (y)) ? (x) : (y)) #endif#ifndefmax#definemax(x,y) (((x) > (y)) ? (x) : (y)) #endifchardiscard[4*1460]; voidsetup(){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 (intloops=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(); #ifdefESP8266tcpDiscardServer.setNoDelay(true); #endifSerial.print("DISCARD daemon listening on port "); Serial.println(DISCARD_PORT)} voidloop(){if (wifiMulti.run() ==WL_CONNECTED){WiFiClientnewClient=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 clientnewClient.stop()} } //check client for dataif (tcpDiscardClient){if (tcpDiscardClient.connected()){intbytesAvail, 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_tdeltaMillis=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