diff --git a/LCS/Transport/include/Transport/TH_Socket.h b/LCS/Transport/include/Transport/TH_Socket.h index e6fc728ed1e5edff1d9000fd4d58b324ac5244c9..95af9a1574c2c593367809e19ae8b7736611bf80 100644 --- a/LCS/Transport/include/Transport/TH_Socket.h +++ b/LCS/Transport/include/Transport/TH_Socket.h @@ -94,6 +94,9 @@ public: // make the connection bool init(); + // init kernel level socket buffer sizes + bool initBuffers(int recvBufferSize = -1, int sendBufferSize = -1); + private: bool openSocket(); diff --git a/LCS/Transport/src/TH_Socket.cc b/LCS/Transport/src/TH_Socket.cc index 0a5a363ad619a923e5d9946a822486004a94fe27..792049bc78405a0bb5f239524bac2d0d8355c011 100644 --- a/LCS/Transport/src/TH_Socket.cc +++ b/LCS/Transport/src/TH_Socket.cc @@ -26,6 +26,11 @@ #include <Common/LofarLogger.h> #include <Transport/TH_Socket.h> +#ifdef __linux__ +#include <sys/sysctl.h> +#endif + + namespace LOFAR { @@ -38,7 +43,7 @@ TH_Socket::TH_Socket (const string& service, bool sync, int32 protocol, int32 backlog, - const bool openSocketNow) : + const bool openSocketNow): itsIsServer (true), itsServerSocket(0), itsDataSocket (0), @@ -222,6 +227,7 @@ int32 TH_Socket::recvNonBlocking(void* buf, int32 nrBytes, int32 /*tag*/, } // It's a total mess, anything could have happend. Bail out. LOG_DEBUG_STR("TH_Socket: serious read-error, result=" << bytesRead); + perror("Socket"); if (itsIsOwner) { // are we the owner? shutdown(itsDataSocket); // completely delete datasocket } @@ -334,6 +340,57 @@ bool TH_Socket::init() return (connectToServer()); } + +bool TH_Socket::initBuffers(int recvBufferSize, int sendBufferSize) { + // set the size of the kernel level socket buffer + // use -1 in the constructor (default) to leave it untouched. + + int socketFD; + if (itsIsServer) socketFD = itsServerSocket->getSid(); + else socketFD = itsDataSocket->getSid(); + + if (recvBufferSize != -1) { +#ifdef __linux__ + int name[] = { CTL_NET, NET_CORE, NET_CORE_RMEM_MAX }; + int value; + size_t valueSize = sizeof(value); + // check the max buffer size of the kernel + sysctl(name, sizeof(name)/sizeof(int), &value, &valueSize, 0, 0); + if (recvBufferSize > value) { + // if the max size is not large enough increase it + if (sysctl(name, sizeof(name)/sizeof(int), 0, 0, &recvBufferSize, sizeof(recvBufferSize)) < 0){ + LOG_WARN("TH_Socket: could not increase max socket receive buffer"); + } + } +#endif + // now set the buffer for our socket + if (setsockopt(socketFD, SOL_SOCKET, SO_RCVBUF, &recvBufferSize, sizeof(recvBufferSize)) < 0) + { + LOG_WARN("TH_Socket: receive buffer size could not be set, default size will be used."); + } + } + if (sendBufferSize != -1) { +#ifdef __linux__ + int name[] = { CTL_NET, NET_CORE, NET_CORE_WMEM_MAX }; + int value; + size_t valueSize = sizeof(value); + // check the max buffer size of the kernel + sysctl(name, sizeof(name)/sizeof(int), &value, &valueSize, 0, 0); + if (sendBufferSize > value) { + // if the max size is not large enough increase it + if (sysctl(name, sizeof(name)/sizeof(int), 0, 0, &sendBufferSize, sizeof(sendBufferSize)) < 0){ + LOG_WARN("TH_Socket: could not increase max socket send buffer"); + } + } +#endif + if (setsockopt(socketFD, SOL_SOCKET, SO_RCVBUF, &sendBufferSize, sizeof(sendBufferSize)) < 0) + { + LOG_WARN("TH_Socket: send buffer size could not be set, default size will be used."); + } + } + return true; +} + // // connectToServer //