aboutsummaryrefslogtreecommitdiff
path: root/server/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/client')
-rw-r--r--server/src/client/client.cpp58
-rw-r--r--server/src/client/client.h29
2 files changed, 65 insertions, 22 deletions
diff --git a/server/src/client/client.cpp b/server/src/client/client.cpp
index 4c458c8..782017f 100644
--- a/server/src/client/client.cpp
+++ b/server/src/client/client.cpp
@@ -16,6 +16,12 @@ bool tcp::client::init_ssl(SSL_CTX *server_ctx) {
}
ret = SSL_accept(m_ssl);
+
+ long result = SSL_get_verify_result(m_ssl);
+
+ auto str = X509_verify_cert_error_string(result);
+ io::logger->info("verify returned {}", str);
+
if (ret <= 0) {
int err = SSL_get_error(m_ssl, ret);
io::logger->error("client {} failed to accept ssl, return code {}", m_ip,
@@ -24,4 +30,54 @@ bool tcp::client::init_ssl(SSL_CTX *server_ctx) {
}
return true;
-} \ No newline at end of file
+}
+
+int tcp::client::stream(std::vector<char> &data) {
+ auto size = data.size();
+
+ auto networked_size = htonl(size);
+ write(&networked_size, sizeof(networked_size));
+
+ // with 4kb chunk size, speed peaks at 90mb/s
+ constexpr size_t chunk_size = 4096;
+ size_t sent = 0;
+
+ while(size > 0) {
+ auto to_send = std::min(size, chunk_size);
+
+ int ret = write(&data[sent], to_send);
+ if(ret <= 0) {
+ break;
+ }
+
+ sent += ret;
+ size -= ret;
+ }
+
+ return sent;
+ }
+
+ int tcp::client::read_stream(std::vector<char> &out) {
+ size_t size;
+ read(&size, sizeof(size));
+
+ size = ntohl(size);
+ out.resize(size);
+
+ constexpr size_t chunk_size = 4096;
+ size_t total = 0;
+
+ while(size > 0) {
+ auto to_read = std::min(size, chunk_size);
+
+ int ret = read(&out[total], to_read);
+ if(ret <= 0) {
+ break;
+ }
+
+ size -= ret;
+ total += ret;
+ }
+
+ return total;
+ } \ No newline at end of file
diff --git a/server/src/client/client.h b/server/src/client/client.h
index 5242ae7..28094ba 100644
--- a/server/src/client/client.h
+++ b/server/src/client/client.h
@@ -11,13 +11,12 @@ class client {
time_t m_time;
std::string m_ip;
- std::array<char, tcp::uid_len> m_uid;
+ std::string m_uid;
+
public:
client() : m_socket{-1} {};
client(const int &socket, const std::string_view ip)
- : m_socket{std::move(socket)}, m_ip{ip}, m_ssl{nullptr} {
-
- }
+ : m_socket{std::move(socket)}, m_ip{ip}, m_ssl{nullptr} {}
~client() = default;
bool init_ssl(SSL_CTX *server_ctx);
@@ -28,27 +27,15 @@ class client {
SSL_free(m_ssl);
}
- int write(void *data, size_t size) {
- return SSL_write(m_ssl, data, size);
- }
+ int write(void *data, size_t size) { return SSL_write(m_ssl, data, size); }
- int read(void *data, size_t size) {
- return SSL_read(m_ssl, data, size);
- }
+ int read(void *data, size_t size) { return SSL_read(m_ssl, data, size); }
- bool set_uid(const std::string_view uid_str) {
- const size_t uid_str_len = uid_str.size();
- if (uid_str_len != tcp::uid_len) {
- io::logger->error("packet uid len mismatch!");
- return false;
- }
+ int stream(std::vector<char> &data);
- for (size_t i = 0; i < uid_len; ++i) {
- m_uid[i] = uid_str[i];
- }
+ int read_stream(std::vector<char> &out);
- return true;
- }
+ void set_uid(const std::string_view uid_str) { m_uid = uid_str; }
int &get_socket() { return m_socket; }
auto &get_ip() { return m_ip; }