From 9bf8c97ebf4d17817133067afc0a907d084ac57d Mon Sep 17 00:00:00 2001 From: Felix The Cat Date: Tue, 14 Mar 2023 23:17:02 +0300 Subject: [PATCH] Added NODELAY option to both server and client --- client/Socket.php | 1 + client/test_client.php | 3 ++- server/CMakeLists.txt | 3 +++ server/SynchronousSocket.cpp | 8 ++++++++ server/log.cpp | 16 ++++++++++++++++ server/log.h | 8 ++++++++ server/tcp_perf_test_server.cpp | 7 +++++++ 7 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 server/log.cpp create mode 100644 server/log.h diff --git a/client/Socket.php b/client/Socket.php index 39e37ab..de2d2c4 100644 --- a/client/Socket.php +++ b/client/Socket.php @@ -142,6 +142,7 @@ class IPSocket extends Socket { throw new Exception("Error creating socket: ".socket_last_error()." ".socket_strerror(socket_last_error())); } + //socket_set_option($this->sock, SOL_TCP, TCP_NODELAY, 1); $this->connected = false; $this->host = $ip; $this->port = $port; diff --git a/client/test_client.php b/client/test_client.php index cf1cd03..59e8a16 100644 --- a/client/test_client.php +++ b/client/test_client.php @@ -36,9 +36,10 @@ function testSocket($amount, $reconnect, $size) $m = makeRequest($size); logTime("begin sending"); $s->sendMessage($m); + $ts = hrtime(true); logTime("sent, receiving"); $r = $s->receiveMessage(); - logTime("received"); + logTime("received, time = ".sprintf("%.3f", (hrtime(true) - $ts) / 1000000.0)); $current++; if ($current >= $reconnect) { diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index e4871c0..f0c4272 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -17,6 +17,9 @@ task.cpp mutex.h mutex.cpp +log.h +log.cpp + SynchronousSocket.cpp SynchronousSocket.h ) diff --git a/server/SynchronousSocket.cpp b/server/SynchronousSocket.cpp index 4b32552..3639bf3 100644 --- a/server/SynchronousSocket.cpp +++ b/server/SynchronousSocket.cpp @@ -7,6 +7,8 @@ #include #include +#include "log.h" + SynchronousSocket::SynchronousSocket() { socket = -1; @@ -63,6 +65,7 @@ void SynchronousSocket::Send(const string & data) { int pos = 0; time_t start = time(NULL); + LogTime("Send() start"); while (pos < (int)data.length()) { int res = send(socket, &((data.data())[pos]), data.length() - pos, 0); @@ -87,17 +90,21 @@ void SynchronousSocket::Send(const string & data) pos += res; } } + LogTime("Send() finish"); } string SynchronousSocket::Receive(int amount) { string r = ""; time_t start = time(NULL); + LogTime("Receive() start"); while ((int)r.length() < amount) { char buf[BUFFER_SIZE]; int to_recv = min((int)sizeof(buf), amount - (int)r.length()); + LogTime("Receive(), before recv"); int res = recv(socket, buf, to_recv, 0); + LogTime("Receive(), after recv"); if (res == 0) { // бросаем специфический exception, означающий, что сокет закрыт @@ -125,6 +132,7 @@ string SynchronousSocket::Receive(int amount) r += string(buf, res); } } + LogTime("Receive() finish"); return r; } diff --git a/server/log.cpp b/server/log.cpp new file mode 100644 index 0000000..9f0bec0 --- /dev/null +++ b/server/log.cpp @@ -0,0 +1,16 @@ +#include "log.h" +#include +#include + +using namespace std; + +void LogTime(const string &message) +{ + static auto start = chrono::high_resolution_clock::now(); + static auto prev = start; + auto current = chrono::high_resolution_clock::now(); + auto nsec = chrono::duration_cast(current - start).count(); + auto nsec_prev = chrono::duration_cast(current - prev).count(); + cerr << (nsec / 1000000.f) << " " << message << " delta " << (nsec_prev / 1000000.0f) << "\n"; + prev = current; +} diff --git a/server/log.h b/server/log.h new file mode 100644 index 0000000..8a1f0f8 --- /dev/null +++ b/server/log.h @@ -0,0 +1,8 @@ +#ifndef LOG_HEADER_FILE_INCLUDED +#define LOG_HEADER_FILE_INCLUDED + +#include + +void LogTime(const std::string &message); + +#endif \ No newline at end of file diff --git a/server/tcp_perf_test_server.cpp b/server/tcp_perf_test_server.cpp index 8ebf493..0620798 100644 --- a/server/tcp_perf_test_server.cpp +++ b/server/tcp_perf_test_server.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -96,6 +97,12 @@ void* IPSocketThread(void* arg) cerr << "Error accepting connection, errno = " << errno << "\n"; continue; } + int yes = 1; + int result = setsockopt(recsock, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(int)); + if (result < 0) + { + cerr << "Error setting socket option, errno = " << errno << "\n"; + } cout << "Accepted connection from " << inet_ntoa(peeraddr.sin_addr) << ":" << ntohs(peeraddr.sin_port) << "\n"; CreateThread(&ProcessRequests, &recsock); }