diff --git a/CMakeLists.txt b/CMakeLists.txt index ab09553d..0ff57333 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(PIP) set(PIP_MAJOR 3) -set(PIP_MINOR 8) -set(PIP_REVISION 2) +set(PIP_MINOR 9) +set(PIP_REVISION 0) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) set(PIP_DOMAIN org.SHS) diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 62d5f16c..7dadc7c8 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -203,8 +203,7 @@ bool PIEthernet::init() { piCoutObj << "Can`t create socket," << ethErrorString(); return false; } - if (params[PIEthernet::ReuseAddress]) ethSetsockoptBool(sock, SOL_SOCKET, SO_REUSEADDR); - if (params[PIEthernet::Broadcast]) ethSetsockoptBool(sock, SOL_SOCKET, SO_BROADCAST); + applyParameters(); applyTimeouts(); applyOptInt(IPPROTO_IP, IP_TTL, TTL()); // piCoutObj << "inited" << path(); @@ -814,6 +813,14 @@ PIIODevice::DeviceInfoFlags PIEthernet::deviceInfoFlags() const { } +void PIEthernet::applyParameters() { + if (sock == -1) return; + if (params[PIEthernet::ReuseAddress]) ethSetsockoptBool(sock, SOL_SOCKET, SO_REUSEADDR); + if (params[PIEthernet::Broadcast]) ethSetsockoptBool(sock, SOL_SOCKET, SO_BROADCAST); + if (params[PIEthernet::NoDelay] && (type() == TCP_Client)) ethSetsockoptBool(sock, IPPROTO_TCP, TCP_NODELAY, true); +} + + void PIEthernet::clientDeleted(PIObject * o) { clients_mutex.lock(); clients_.removeOne((PIEthernet *)o); diff --git a/libs/main/io_devices/piethernet.h b/libs/main/io_devices/piethernet.h index e8c1f3bf..e10925dd 100644 --- a/libs/main/io_devices/piethernet.h +++ b/libs/main/io_devices/piethernet.h @@ -60,7 +60,8 @@ public: = 0x4, MulticastLoop /** Enable receiving multicast packets from same host. Enabled by default */ = 0x8, KeepConnection /** Automatic reconnect TCP connection on disconnect. Enabled by default */ = 0x10, - DisonnectOnTimeout /** Disconnect TCP connection on read timeout expired. Disabled by default */ = 0x20 + DisonnectOnTimeout /** Disconnect TCP connection on read timeout expired. Disabled by default */ = 0x20, + NoDelay /** Use NO_DELAY option. Disabled by default */ = 0x40 }; typedef ::PINetworkAddress Address DEPRECATEDM("use PINetworkAddress instead"); @@ -152,10 +153,16 @@ public: //! Set parameters to "parameters_". You should to reopen %PIEthernet to apply them - void setParameters(PIFlags parameters_) { params = parameters_; } + void setParameters(PIFlags parameters_) { + params = parameters_; + applyParameters(); + } //! Set parameter "parameter" to state "on". You should to reopen %PIEthernet to apply this - void setParameter(PIEthernet::Parameters parameter, bool on = true) { params.setFlag(parameter, on); } + void setParameter(PIEthernet::Parameters parameter, bool on = true) { + params.setFlag(parameter, on); + applyParameters(); + } //! Returns if parameter "parameter" is set bool isParameterSet(PIEthernet::Parameters parameter) const { return params[parameter]; } @@ -457,6 +464,7 @@ protected: ssize_t readDevice(void * read_to, ssize_t max_size) override; ssize_t writeDevice(const void * data, ssize_t max_size) override; DeviceInfoFlags deviceInfoFlags() const override; + void applyParameters(); //! Executes when any read function was successful. Default implementation does nothing virtual void received(const void * data, int size) { ; }