From 95002973e891f98bbd8ffefbfc88901b67af749c Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 13 Apr 2021 18:29:21 +0300 Subject: [PATCH] PIEthernet send to custom address fix --- libs/main/io_devices/piethernet.cpp | 51 +++++++++++++++++++++++++++++ libs/main/io_devices/piethernet.h | 22 ++++++------- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 1de2c930..32d5b973 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -621,6 +621,57 @@ bool PIEthernet::listen(bool threaded) { } +bool PIEthernet::listen(const PIEthernet::Address & addr, bool threaded) { + setReadAddress(addr); + return listen(threaded); +} + + +bool PIEthernet::send(const void * data, int size, bool threaded) { + if (threaded) { + writeThreaded(data, size); + return true; + } + return (write(data, size) == size); +} + + +bool PIEthernet::send(const PIEthernet::Address & addr, const void * data, int size, bool threaded) { + addr_s = addr; + if (threaded) { + writeThreaded(data, size); + return true; + } + Address pa = addr_s; + addr_s = addr; + int wr = write(data, size); + addr_s = pa; + return (wr == size); +} + + +bool PIEthernet::send(const PIByteArray & data, bool threaded) { + if (threaded) { + writeThreaded(data); + return true; + } + return (write(data) == data.size_s()); +} + + +bool PIEthernet::send(const PIEthernet::Address & addr, const PIByteArray & data, bool threaded) { + if (threaded) { + writeThreaded(data); + return true; + } + Address pa = addr_s; + addr_s = addr; + int wr = write(data); + addr_s = pa; + return (wr == data.size_s()); +} + + int PIEthernet::readDevice(void * read_to, int max_size) { //piCout << "read" << sock; if (sock == -1) init(); diff --git a/libs/main/io_devices/piethernet.h b/libs/main/io_devices/piethernet.h index 4f80e90f..ebacf5be 100644 --- a/libs/main/io_devices/piethernet.h +++ b/libs/main/io_devices/piethernet.h @@ -273,13 +273,13 @@ public: bool listen(bool threaded = false); //! Start listen for incoming TCP connections on address "ip":"port". Use only for TCP_Server - bool listen(const PIString & ip, int port, bool threaded = false) {setReadAddress(ip, port); return listen(threaded);} + bool listen(const PIString & ip, int port, bool threaded = false) {return listen(PIEthernet::Address(ip, port), threaded);} //! Start listen for incoming TCP connections on address "ip_port". Use only for TCP_Server - bool listen(const PIString & ip_port, bool threaded = false) {setReadAddress(ip_port); return listen(threaded);} + bool listen(const PIString & ip_port, bool threaded = false) {return listen(PIEthernet::Address(ip_port), threaded);} //! Start listen for incoming TCP connections on address "addr". Use only for TCP_Server - bool listen(const Address & addr, bool threaded = false) {setReadAddress(addr); return listen(threaded);} + bool listen(const Address & addr, bool threaded = false); PIEthernet * client(int index) {return clients_[index];} int clientsCount() const {return clients_.size_s();} @@ -287,28 +287,28 @@ public: //! Send data "data" with size "size" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client - bool send(const void * data, int size, bool threaded = false) {if (threaded) {writeThreaded(data, size); return true;} return (write(data, size) == size);} + bool send(const void * data, int size, bool threaded = false); //! Send data "data" with size "size" to address "ip":"port" - bool send(const PIString & ip, int port, const void * data, int size, bool threaded = false) {addr_s.set(ip, port); if (threaded) {writeThreaded(data, size); return true;} return send(data, size);} + bool send(const PIString & ip, int port, const void * data, int size, bool threaded = false) {return send(PIEthernet::Address(ip, port), data, size, threaded);} //! Send data "data" with size "size" to address "ip_port" - bool send(const PIString & ip_port, const void * data, int size, bool threaded = false) {addr_s.set(ip_port); if (threaded) {writeThreaded(data, size); return true;} return send(data, size);} + bool send(const PIString & ip_port, const void * data, int size, bool threaded = false) {return send(PIEthernet::Address(ip_port), data, size, threaded);} //! Send data "data" with size "size" to address "addr" - bool send(const Address & addr, const void * data, int size, bool threaded = false) {addr_s = addr; if (threaded) {writeThreaded(data, size); return true;} return send(data, size);} + bool send(const Address & addr, const void * data, int size, bool threaded = false); //! Send data "data" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client - bool send(const PIByteArray & data, bool threaded = false) {if (threaded) {writeThreaded(data); return true;} return (write(data) == data.size_s());} + bool send(const PIByteArray & data, bool threaded = false); //! Send data "data" to address "ip":"port" for UDP - bool send(const PIString & ip, int port, const PIByteArray & data, bool threaded = false) {addr_s.set(ip, port); if (threaded) {writeThreaded(data); return true;} return send(data);} + bool send(const PIString & ip, int port, const PIByteArray & data, bool threaded = false) {return send(PIEthernet::Address(ip, port), data, threaded);} //! Send data "data" to address "ip_port" for UDP - bool send(const PIString & ip_port, const PIByteArray & data, bool threaded = false) {addr_s.set(ip_port); if (threaded) {writeThreaded(data); return true;} return (write(data) == data.size_s());} + bool send(const PIString & ip_port, const PIByteArray & data, bool threaded = false) {return send(PIEthernet::Address(ip_port), data, threaded);} //! Send data "data" to address "addr" for UDP - bool send(const Address & addr, const PIByteArray & data, bool threaded = false) {addr_s = addr; if (threaded) {writeThreaded(data); return true;} return (write(data) == data.size_s());} + bool send(const Address & addr, const PIByteArray & data, bool threaded = false); virtual bool canWrite() const {return mode() & WriteOnly;}