From 7dd381f568938971e9c69a074def5da058d5c242 Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Wed, 19 Jun 2013 21:53:12 +0200 Subject: Do not send too much data over SSL in one go Some clients fail to read it entirely and the remaining data stays in their read buffer until new data arrives --- src/inspsocket.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/inspsocket.cpp') diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index d78ace318..410f928d9 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -248,11 +248,13 @@ void StreamSocket::DoWrite() // The length limit of 1024 is to prevent merging strings // more than once when writes begin to block. std::string tmp; - tmp.reserve(sendq_len); - for(unsigned int i=0; i < sendq.size(); i++) - tmp.append(sendq[i]); - sendq.clear(); - sendq.push_back(tmp); + tmp.reserve(1280); + while (!sendq.empty() && tmp.length() < 1024) + { + tmp.append(sendq.front()); + sendq.pop_front(); + } + sendq.push_front(tmp); } std::string& front = sendq.front(); int itemlen = front.length(); -- cgit v1.3.1-10-gc9f91 From 6e0b904d342461cd2ac2a3cd0cf2a43d864d2b00 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 3 Jul 2013 17:26:45 -0400 Subject: Use the correct socket related error messages on Windows --- include/socketengine.h | 8 ++++++++ src/inspsocket.cpp | 10 +++++----- src/socketengine.cpp | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) (limited to 'src/inspsocket.cpp') diff --git a/include/socketengine.h b/include/socketengine.h index 2fc3cdbfd..37b7d6373 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -494,6 +494,14 @@ public: * Checks EAGAIN and WSAEWOULDBLOCK */ static bool IgnoreError(); + + /** Return the last socket related error. strrerror(errno) on *nix + */ + static std::string LastError(); + + /** Returns the error for the given error num, strerror(errnum) on *nix + */ + static std::string GetError(int errnum); }; inline bool SocketEngine::IgnoreError() diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 410f928d9..356904f74 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -56,7 +56,7 @@ void BufferedSocket::DoConnect(const std::string &ipaddr, int aport, unsigned lo if (err != I_ERR_NONE) { state = I_ERROR; - SetError(strerror(errno)); + SetError(SocketEngine::LastError()); OnError(err); } } @@ -210,7 +210,7 @@ void StreamSocket::DoRead() } else { - error = strerror(errno); + error = SocketEngine::LastError(); ServerInstance->SE->ChangeEventMask(this, FD_WANT_NO_READ | FD_WANT_NO_WRITE); } } @@ -296,7 +296,7 @@ void StreamSocket::DoWrite() if (errno == EINTR || SocketEngine::IgnoreError()) ServerInstance->SE->ChangeEventMask(this, FD_WANT_FAST_WRITE | FD_WRITE_WILL_BLOCK); else - SetError(strerror(errno)); + SetError(SocketEngine::LastError()); return; } else if (rv < itemlen) @@ -401,7 +401,7 @@ void StreamSocket::DoWrite() } else { - error = strerror(errno); + error = SocketEngine::LastError(); } } if (!error.empty()) @@ -496,7 +496,7 @@ void StreamSocket::HandleEvent(EventType et, int errornum) if (errornum == 0) SetError("Connection closed"); else - SetError(strerror(errornum)); + SetError(SocketEngine::GetError(errornum)); switch (errornum) { case ETIMEDOUT: diff --git a/src/socketengine.cpp b/src/socketengine.cpp index 6c99edc95..8af598b06 100644 --- a/src/socketengine.cpp +++ b/src/socketengine.cpp @@ -255,3 +255,26 @@ void SocketEngine::GetStats(float &kbitpersec_in, float &kbitpersec_out, float & kbitpersec_in = in_kbit / 1024; kbitpersec_out = out_kbit / 1024; } + +std::string SocketEngine::LastError() +{ +#ifndef _WIN32 + return strerror(errno); +#else + char szErrorString[500]; + DWORD dwErrorCode = WSAGetLastError(); + if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)szErrorString, _countof(szErrorString), NULL) == 0) + sprintf_s(szErrorString, _countof(szErrorString), "Error code: %u", dwErrorCode); + return szErrorString; +#endif +} + +std::string SocketEngine::GetError(int errnum) +{ +#ifndef _WIN32 + return strerror(errnum); +#else + WSASetLastError(errnum); + return LastError(); +#endif +} -- cgit v1.3.1-10-gc9f91