diff --git a/src/platform/linux/linux_socket.cpp b/src/platform/linux/linux_socket.cpp index 297c1a1..f5da455 100755 --- a/src/platform/linux/linux_socket.cpp +++ b/src/platform/linux/linux_socket.cpp @@ -27,7 +27,7 @@ namespace Bk::Net { LinuxSocket::~LinuxSocket() { - close(id); + if(id > 0) close(id); } bool LinuxSocket::init() @@ -53,10 +53,10 @@ namespace Bk::Net { return true; } - std::unique_ptr LinuxSocket::ack() + Socket* LinuxSocket::ack() { socklen_t addrlen = sizeof(addr); - return std::unique_ptr(Socket::create(accept(id, (struct sockaddr*)&addr, &addrlen), ip_addr.version, ip_proto)); + return new LinuxSocket(accept(id, (struct sockaddr*)&addr, &addrlen), ip_addr.version, ip_proto); } bool LinuxSocket::conn() @@ -69,6 +69,14 @@ namespace Bk::Net { return true; } + bool LinuxSocket::hasConnection(int seconds, int microseconds) { + struct timeval tv = { seconds, microseconds }; + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(id, &rfds); + return select(id + 1, &rfds, (fd_set*)0, (fd_set*)0, &tv) > 0; + }; + void LinuxSocket::emit(std::vector packet) { write(id, packet.data(), packet.size()); @@ -83,13 +91,13 @@ namespace Bk::Net { return buffer; } - std::unique_ptr Socket::create(IpAddress ip, int port, IpProtocol proto) + Socket* Socket::create(IpAddress ip, int port, IpProtocol proto) { - return std::unique_ptr(new LinuxSocket(ip, port, proto)); + return new LinuxSocket(ip, port, proto); } - std::unique_ptr Socket::create(int id, IpVersion ver, IpProtocol proto) + Socket* Socket::create(int id, IpVersion ver, IpProtocol proto) { - return std::unique_ptr(new LinuxSocket(id, ver, proto)); + return new LinuxSocket(id, ver, proto); } } \ No newline at end of file diff --git a/src/platform/linux/linux_socket.h b/src/platform/linux/linux_socket.h index c20c1f4..287ea0c 100755 --- a/src/platform/linux/linux_socket.h +++ b/src/platform/linux/linux_socket.h @@ -13,9 +13,11 @@ namespace Bk::Net { bool init() override; bool start(int cpt_conn) override; - std::unique_ptr ack() override; + Socket* ack() override; bool conn() override; + bool hasConnection(int seconds = 0, int microseconds = 0) override; + int get_raw_socket() override { return id; } const std::string get_ip() override { return ip_addr.str; } diff --git a/src/platform/windows/windows_socket.cpp b/src/platform/windows/windows_socket.cpp index 1117f5e..1927c51 100755 --- a/src/platform/windows/windows_socket.cpp +++ b/src/platform/windows/windows_socket.cpp @@ -69,7 +69,7 @@ namespace Bk::Net { Socket* WindowsSocket::ack() { socklen_t addrlen = sizeof(addr); - return Socket::create(accept((SOCKET)id, (struct sockaddr*)&addr, &addrlen), ip_addr.version, ip_proto); + return WindowsSocket(accept((SOCKET)id, (struct sockaddr*)&addr, &addrlen), ip_addr.version, ip_proto)); } bool WindowsSocket::conn()