From 67b2440096594272493e1ee8c02a9762442d586e Mon Sep 17 00:00:00 2001 From: anulax1225 Date: Mon, 24 Feb 2025 02:21:56 +0100 Subject: [PATCH] Better linux socket --- src/bakanet/core/socket.h | 2 ++ src/platform/linux/linux_ip_address.cpp | 2 -- src/platform/linux/linux_socket.cpp | 29 ++++++++++++++++++------- src/platform/linux/linux_socket.h | 4 ++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/bakanet/core/socket.h b/src/bakanet/core/socket.h index 4220376..8e02972 100755 --- a/src/bakanet/core/socket.h +++ b/src/bakanet/core/socket.h @@ -19,6 +19,8 @@ namespace Bk::Net { virtual Socket* ack() = 0; virtual bool conn() = 0; + virtual bool isConnected() = 0; + virtual int get_raw_socket() = 0; virtual const std::string get_ip() = 0; diff --git a/src/platform/linux/linux_ip_address.cpp b/src/platform/linux/linux_ip_address.cpp index a872ca4..0a42620 100755 --- a/src/platform/linux/linux_ip_address.cpp +++ b/src/platform/linux/linux_ip_address.cpp @@ -1,6 +1,4 @@ #include -#include - namespace Bk::Net { struct in_addr IpAddress::get_data() { diff --git a/src/platform/linux/linux_socket.cpp b/src/platform/linux/linux_socket.cpp index 22042ec..08edd1a 100755 --- a/src/platform/linux/linux_socket.cpp +++ b/src/platform/linux/linux_socket.cpp @@ -1,4 +1,6 @@ #include "linux_socket.h" +#include +#include #include #include @@ -6,7 +8,6 @@ namespace Bk::Net { LinuxSocket::LinuxSocket(int id, struct sockaddr_in client_addr, IpVersion ver, IpProtocol proto) : id(id), ip_proto(proto), addr(client_addr) { - char* myIP = inet_ntoa(addr.sin_addr); ip_addr = IpAddress(std::string(myIP), ver); } @@ -62,7 +63,7 @@ namespace Bk::Net { bool LinuxSocket::conn() { - if (connect(id, (struct sockaddr*)&addr, sizeof(addr)) < 0) + if (connect(id, (struct sockaddr*)&addr, sizeof(addr)) != 0) { BK_CORE_ERROR("Connection failed"); return false; @@ -70,18 +71,30 @@ namespace Bk::Net { return true; } + bool LinuxSocket::isConnected() + { + char data = 0; + int read_size = recv(id, &data, 1, MSG_PEEK); + return (bool)read_size; + } + void LinuxSocket::emit(std::vector packet) { - write(id, packet.data(), packet.size()); + size_t size = send(id, packet.data(), packet.size(), 0); } std::vector LinuxSocket::obtain(int size) { - std::vector buffer; - buffer.resize(size); - int read_size = read(id, buffer.data(), buffer.size() - 1); - buffer.resize(read_size); - return buffer; + if(size > this->size) + { + delete [] buffer; + buffer = new char[size]; + this->size = size; + } + int read_size = recv(id, buffer, this->size - 1, 0); + if(read_size == -1) return std::vector(0); + std::vector packet(buffer, buffer + read_size); + return packet; } Socket* Socket::create(IpAddress ip, int port, IpProtocol proto) diff --git a/src/platform/linux/linux_socket.h b/src/platform/linux/linux_socket.h index 0903779..92470f6 100755 --- a/src/platform/linux/linux_socket.h +++ b/src/platform/linux/linux_socket.h @@ -16,6 +16,8 @@ namespace Bk::Net { Socket* ack() override; bool conn() override; + bool isConnected() override; + int get_raw_socket() override { return id; } const std::string get_ip() override { return ip_addr.str; } @@ -24,6 +26,8 @@ namespace Bk::Net { private: Connection id; + int size = 1024; + char* buffer = new char[size]; struct sockaddr_in addr; IpAddress ip_addr; IpProtocol ip_proto;