PIEthernet fix: no more close outdated fd on disconnect (error at work with MHD)

This commit is contained in:
2026-08-17 20:26:36 +03:00
parent aed98059de
commit b1060fd572
2 changed files with 14 additions and 10 deletions
+13 -10
View File
@@ -214,9 +214,7 @@ void PIEthernet::init() {
if (sock != -1) return; if (sock != -1) return;
// piCout << "init " << type(); // piCout << "init " << type();
PRIVATE->event.destroy(); PRIVATE->event.destroy();
if (sock_s == sock) sock_s = -1; closeSockets();
closeSocket(sock);
closeSocket(sock_s);
int st = 0, pr = 0; int st = 0, pr = 0;
if (type() == UDP) { if (type() == UDP) {
st = SOCK_DGRAM; st = SOCK_DGRAM;
@@ -356,6 +354,13 @@ void PIEthernet::closeSocket(int & sd) {
} }
void PIEthernet::closeSockets() {
if (sock_s == sock) sock_s = -1;
closeSocket(sock);
closeSocket(sock_s);
}
void PIEthernet::applyTimeouts() { void PIEthernet::applyTimeouts() {
if (sock < 0) return; if (sock < 0) return;
PISystemTime rtm = readTimeout(), wtm = writeTimeout(); PISystemTime rtm = readTimeout(), wtm = writeTimeout();
@@ -383,7 +388,7 @@ void PIEthernet::applyBuffers() {
void PIEthernet::applyTimeout(int fd, int opt, PISystemTime tm) { void PIEthernet::applyTimeout(int fd, int opt, PISystemTime tm) {
if (fd == 0) return; if (fd == 0) return;
// piCoutObj << "setReadIsBlocking" << yes; // piCoutObj << "setReadIsBlocking" << yes;
#ifdef WINDOWS #ifdef WINDOWS
DWORD _tm = tm.toMilliseconds(); DWORD _tm = tm.toMilliseconds();
#else #else
@@ -577,9 +582,7 @@ void PIEthernet::stopThreadedListen() {
if (!server_thread_.waitForFinish(1_s)) server_thread_.terminate(); if (!server_thread_.waitForFinish(1_s)) server_thread_.terminate();
} }
PRIVATE->event.destroy(); PRIVATE->event.destroy();
if (sock_s == sock) sock_s = -1; closeSockets();
closeSocket(sock);
closeSocket(sock_s);
} }
@@ -736,7 +739,7 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
if (connected_.exchange(false)) { if (connected_.exchange(false)) {
opened_ = false; opened_ = false;
// piCoutObj << "Disconnect on read," << ethErrorString(); // piCoutObj << "Disconnect on read," << ethErrorString();
closeSocket(sock); closeSockets();
init(); init();
disconnected(rs < 0); disconnected(rs < 0);
} }
@@ -831,7 +834,7 @@ ssize_t PIEthernet::writeDevice(const void * data, ssize_t max_size) {
if (connected_.exchange(false)) { if (connected_.exchange(false)) {
opened_ = false; opened_ = false;
// piCoutObj << "Disconnect on write," << ethErrorString(); // piCoutObj << "Disconnect on write," << ethErrorString();
closeSocket(sock); closeSockets();
init(); init();
disconnected(true); disconnected(true);
if (params[KeepConnection]) { if (params[KeepConnection]) {
@@ -988,7 +991,7 @@ bool PIEthernet::connectTCP() {
if (ethIsWriteable(sock)) if (ethIsWriteable(sock))
return true; return true;
else { else {
closeSocket(sock); closeSockets();
init(); init();
} }
} }
+1
View File
@@ -653,6 +653,7 @@ protected:
bool openDevice() override; bool openDevice() override;
bool closeDevice() override; bool closeDevice() override;
void closeSocket(int & sd); void closeSocket(int & sd);
void closeSockets();
void applyTimeouts(); void applyTimeouts();
void applyBuffers(); void applyBuffers();
void applyTimeout(int fd, int opt, PISystemTime tm); void applyTimeout(int fd, int opt, PISystemTime tm);