PIEthernet fix: no more close outdated fd on disconnect (error at work with MHD)
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user