From fd2ec05b86165b4fa5c02db1539eb4469bcb1d83 Mon Sep 17 00:00:00 2001 From: ambigipathyv Date: Thu, 14 Mar 2024 10:38:34 +0100 Subject: [PATCH] Added non blocking obtain --- bakanet/src/bakanet/http/http_server.cpp | 2 +- bakanet/src/bakanet/sock_layer/socket.h | 3 +++ bakanet/src/bakanetpch.h | 1 + bakanet/src/platform/linux/linux_socket.cpp | 24 +++++++++++++++++++++ bakanet/src/platform/linux/linux_socket.h | 2 ++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/bakanet/src/bakanet/http/http_server.cpp b/bakanet/src/bakanet/http/http_server.cpp index 1292865..64269d2 100755 --- a/bakanet/src/bakanet/http/http_server.cpp +++ b/bakanet/src/bakanet/http/http_server.cpp @@ -28,7 +28,7 @@ namespace Bk::Net { bool reading = true; while(reading) { - auto data = socket->obtain(conn, 4); + auto data = socket->obtain(conn); log("SIZE " << data.size()) reading = req.append_data(data); } diff --git a/bakanet/src/bakanet/sock_layer/socket.h b/bakanet/src/bakanet/sock_layer/socket.h index 56057dc..538ab20 100755 --- a/bakanet/src/bakanet/sock_layer/socket.h +++ b/bakanet/src/bakanet/sock_layer/socket.h @@ -24,6 +24,8 @@ namespace Bk::Net { virtual void emit(Connection socket, std::vector packet) = 0; virtual std::vector obtain(int size) = 0; virtual std::vector obtain(Connection socket, int size) = 0; + virtual std::vector obtain() = 0; + virtual std::vector obtain(Connection socket) = 0; template static bool set_option(Socket& socket, int level, int option_name, const T* option_value) @@ -32,6 +34,7 @@ namespace Bk::Net { log(status) return status == 0 ? true : false; } + static std::unique_ptr create(IpAddress ip, int port, IpProtocol proto); }; } \ No newline at end of file diff --git a/bakanet/src/bakanetpch.h b/bakanet/src/bakanetpch.h index 97adfbe..e8ab19f 100755 --- a/bakanet/src/bakanetpch.h +++ b/bakanet/src/bakanetpch.h @@ -21,6 +21,7 @@ #include #pragma comment(lib,"WS2_32.lib") #elif BK_PLAFORM_LINUX + #include #include #include #include diff --git a/bakanet/src/platform/linux/linux_socket.cpp b/bakanet/src/platform/linux/linux_socket.cpp index 7c7638f..ef339c9 100755 --- a/bakanet/src/platform/linux/linux_socket.cpp +++ b/bakanet/src/platform/linux/linux_socket.cpp @@ -86,6 +86,30 @@ namespace Bk::Net { buffer.resize(read_size); return buffer; } + + virtual std::vector obtain() + { + std::vector buffer(0); + int len = 0; + ioctl(sock, FIONREAD, &len); + if (len > 0) { + buffer.resize(len); + len = read(socket_id, buffer.data(), buffer.size() - 1); + } + return buffer; + } + + virtual std::vector obtain(Connection socket) + { + std::vector buffer(0); + int len = 0; + ioctl(sock, FIONREAD, &len); + if (len > 0) { + buffer.resize(len); + len = read(conn, buffer.data(), buffer.size() - 1); + } + return buffer; + } std::unique_ptr Socket::create(IpAddress ip, int port, IpProtocol proto) { diff --git a/bakanet/src/platform/linux/linux_socket.h b/bakanet/src/platform/linux/linux_socket.h index 8ecd699..fadf8ff 100755 --- a/bakanet/src/platform/linux/linux_socket.h +++ b/bakanet/src/platform/linux/linux_socket.h @@ -20,6 +20,8 @@ namespace Bk::Net { void emit(Connection socket, std::vector packet) override; std::vector obtain(int size) override; std::vector obtain(Connection socket, int size) override; + std::vector obtain() override; + std::vector obtain(Connection socket) override; private: Connection socket_id;