Added fr::Socket::has_data to check if recv buffer is empty
If using a SocketSelector, you should keep accepting data from the socket until has_data returns false, indicating that you've read everything.
This commit is contained in:
parent
8638b70fb8
commit
2a5d960e56
@ -98,6 +98,14 @@ namespace fr
|
||||
abort();
|
||||
}
|
||||
|
||||
/*!
|
||||
* Checks to see if there's data still in the socket's
|
||||
* recv buffer.
|
||||
*
|
||||
* @return True if there is data in the buffer, false otherwise.
|
||||
*/
|
||||
virtual bool has_data() const override;
|
||||
|
||||
private:
|
||||
std::string unprocessed_buffer;
|
||||
std::unique_ptr<char[]> recv_buffer;
|
||||
|
||||
@ -146,6 +146,14 @@ namespace fr
|
||||
*/
|
||||
void shutdown();
|
||||
|
||||
/*!
|
||||
* Checks to see if there's data still in the socket's
|
||||
* recv buffer.
|
||||
*
|
||||
* @return True if there is data in the buffer, false otherwise.
|
||||
*/
|
||||
virtual bool has_data() const = 0;
|
||||
|
||||
protected:
|
||||
std::string remote_address;
|
||||
bool is_blocking;
|
||||
|
||||
@ -45,6 +45,7 @@ private:
|
||||
virtual fr::Socket::Status send_raw(const char*, size_t){return Socket::Error;}
|
||||
virtual fr::Socket::Status receive_raw(void*, size_t, size_t&){return Socket::Error;}
|
||||
virtual int32_t get_socket_descriptor() const {return socket_descriptor;}
|
||||
virtual bool has_data() const override {return false;};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@ -18,7 +18,10 @@ class TcpSocket : public Socket
|
||||
public:
|
||||
TcpSocket() noexcept;
|
||||
virtual ~TcpSocket() noexcept;
|
||||
TcpSocket(TcpSocket &&) noexcept = default;
|
||||
TcpSocket(TcpSocket &&other) noexcept
|
||||
: unprocessed_buffer(std::move(other.unprocessed_buffer)),
|
||||
recv_buffer(std::move(other.recv_buffer)),
|
||||
socket_descriptor(other.socket_descriptor){}
|
||||
void operator=(const TcpSocket &other)=delete;
|
||||
|
||||
/*!
|
||||
@ -92,6 +95,14 @@ public:
|
||||
*/
|
||||
int32_t get_socket_descriptor() const override;
|
||||
|
||||
/*!
|
||||
* Checks to see if there's data still in the socket's
|
||||
* recv buffer.
|
||||
*
|
||||
* @return True if there is data in the buffer, false otherwise.
|
||||
*/
|
||||
virtual bool has_data() const override;
|
||||
|
||||
protected:
|
||||
std::string unprocessed_buffer;
|
||||
std::unique_ptr<char[]> recv_buffer;
|
||||
|
||||
@ -168,6 +168,11 @@ namespace fr
|
||||
is_connected = true;
|
||||
ssl_socket_descriptor = std::move(context);
|
||||
}
|
||||
|
||||
bool SSLSocket::has_data() const
|
||||
{
|
||||
return !unprocessed_buffer.empty();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -159,4 +159,9 @@ namespace fr
|
||||
{
|
||||
return socket_descriptor;
|
||||
}
|
||||
|
||||
bool TcpSocket::has_data() const
|
||||
{
|
||||
return !unprocessed_buffer.empty();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user