diff --git a/common/cpp/src/system_io.cpp b/common/cpp/src/system_io.cpp index bebd718fb73d66045349330cf67a0e1272e99a55..933c55bdc8e30b17945a6988a12e149c271ecbbb 100644 --- a/common/cpp/src/system_io.cpp +++ b/common/cpp/src/system_io.cpp @@ -75,11 +75,11 @@ hidra2::FileDescriptor hidra2::SystemIO::CreateAndConnectIPTCPSocket(const std:: if(*err != IOErrors::kNoError) { return -1; } - InetConnect(fd, address, err); - if (*err != IOErrors::kNoError) { - CloseSocket(fd, nullptr); - return -1; - } + InetConnect(fd, address, err); + if (*err != IOErrors::kNoError) { + CloseSocket(fd, nullptr); + return -1; + } return fd; } @@ -285,27 +285,27 @@ void hidra2::SystemIO::Listen(SocketDescriptor socket_fd, int backlog, hidra2::I size_t hidra2::SystemIO::ReceiveTimeout(SocketDescriptor socket_fd, void* buf, size_t length, long timeout_in_usec, - IOErrors* err) const { - *err = hidra2::IOErrors::kNoError; - - fd_set read_fds; - FD_ZERO(&read_fds); - FD_SET(socket_fd, &read_fds); - timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = timeout_in_usec; - - int res = ::select(socket_fd + 1, &read_fds, nullptr, nullptr, &timeout); - if (res == 0) { - *err = IOErrors::kTimeout; - return 0; - } - if (res == -1) { - *err = GetLastError(); - return 0; - } - - return Receive(socket_fd, buf, length, err); + IOErrors* err) const { + *err = hidra2::IOErrors::kNoError; + + fd_set read_fds; + FD_ZERO(&read_fds); + FD_SET(socket_fd, &read_fds); + timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = timeout_in_usec; + + int res = ::select(socket_fd + 1, &read_fds, nullptr, nullptr, &timeout); + if (res == 0) { + *err = IOErrors::kTimeout; + return 0; + } + if (res == -1) { + *err = GetLastError(); + return 0; + } + + return Receive(socket_fd, buf, length, err); } @@ -447,14 +447,14 @@ void hidra2::SystemIO::InetConnect(SocketDescriptor socket_fd, const std::string socket_address.sin_port = htons(port); socket_address.sin_family = family; - if (_connect(socket_fd, (struct sockaddr*) &socket_address, sizeof(socket_address)) == -1) { - *err = GetLastError(); - // On windows its normal that connect might throw a "WSAEWOULDBLOCK" since the socket need time to be created - if (*err != IOErrors::kNoError && *err != IOErrors::kResourceTemporarilyUnavailable) { - return; - } - } - *err = IOErrors::kNoError; + if (_connect(socket_fd, (struct sockaddr*) &socket_address, sizeof(socket_address)) == -1) { + *err = GetLastError(); + // On windows its normal that connect might throw a "WSAEWOULDBLOCK" since the socket need time to be created + if (*err != IOErrors::kNoError && *err != IOErrors::kResourceTemporarilyUnavailable) { + return; + } + } + *err = IOErrors::kNoError; } std::unique_ptr<std::tuple<std::string, SocketDescriptor>> SystemIO::InetAccept(SocketDescriptor socket_fd, @@ -468,21 +468,21 @@ IOErrors* err) const { sockaddr_in client_address{}; static size_t client_address_size = sizeof(sockaddr_in); - int peer_fd; - while (true) { - peer_fd = _accept(socket_fd, reinterpret_cast<sockaddr*>(&client_address), &client_address_size); - - if (peer_fd == -1) { - *err = GetLastError(); - if (*err == IOErrors::kResourceTemporarilyUnavailable) { - continue; - } - return nullptr; - } - break; - } - - *err = IOErrors::kNoError; + int peer_fd; + while (true) { + peer_fd = _accept(socket_fd, reinterpret_cast<sockaddr*>(&client_address), &client_address_size); + + if (peer_fd == -1) { + *err = GetLastError(); + if (*err == IOErrors::kResourceTemporarilyUnavailable) { + continue; + } + return nullptr; + } + break; + } + + *err = IOErrors::kNoError; ApplyNetworkOptions(peer_fd, err); std::string diff --git a/common/cpp/src/system_io_linux.cpp b/common/cpp/src/system_io_linux.cpp index 43478ca2422b6e604d992c77e830015faaf31f31..02b2c6503309b0e925093bd74b217de077abf066 100644 --- a/common/cpp/src/system_io_linux.cpp +++ b/common/cpp/src/system_io_linux.cpp @@ -160,6 +160,22 @@ void SystemIO::CollectFileInformationRecursivly(const std::string& path, closedir(dir); } +void hidra2::SystemIO::ApplyNetworkOptions(SocketDescriptor socket_fd, IOErrors* err) const { + //TODO: Need to change network layer code, so everything can be NonBlocking + //int flags; + if ( + /*(flags = fcntl(socket_fd, F_GETFL, 0)) == -1 + || + fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK) == -1 + ||*/ + setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 + || + setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 + ) { + *err = GetLastError(); + } +} + hidra2::FileDescriptor hidra2::SystemIO::_open(const char* filename, int posix_open_flags) const { return ::open(filename, posix_open_flags, S_IWUSR | S_IRWXU); } diff --git a/common/cpp/src/system_io_windows.cpp b/common/cpp/src/system_io_windows.cpp index 519ed12a71232a7cedbf535c47720bdd5976ee58..f8ff667a3b8619e51bbb75ea8720787198ea2d32 100644 --- a/common/cpp/src/system_io_windows.cpp +++ b/common/cpp/src/system_io_windows.cpp @@ -31,8 +31,8 @@ IOErrors IOErrorFromGetLastError() { return IOErrors::kConnectionResetByPeer; case WSAENOTSOCK: return IOErrors::kSocketOperationOnNonSocket; - case WSAEWOULDBLOCK: - return IOErrors::kResourceTemporarilyUnavailable; + case WSAEWOULDBLOCK: + return IOErrors::kResourceTemporarilyUnavailable; default: std::cout << "[IOErrorFromGetLastError] Unknown error code: " << last_error << std::endl; return IOErrors::kUnknownError; @@ -142,25 +142,22 @@ void SystemIO::CollectFileInformationRecursivly(const std::string& path, } } - - - void hidra2::SystemIO::ApplyNetworkOptions(SocketDescriptor socket_fd, IOErrors* err) const { - //TODO: Seeing issues when using these settings - need further investigation - //Event if NonBlockingIO is set, it seems that _recv is a blocking call :/ - /* - static u_long iMode = 1; - - if ( - ioctlsocket(socket_fd, FIONBIO, &iMode) != 0 - || - setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 - || - setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 - ) { - *err = GetLastError(); - } - */ + //TODO: Seeing issues when using these settings - need further investigation + //Event if NonBlockingIO is set, it seems that _recv is a blocking call :/ + /* + static u_long iMode = 1; + + if ( + ioctlsocket(socket_fd, FIONBIO, &iMode) != 0 + || + setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 + || + setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0 + ) { + *err = GetLastError(); + } + */ } FileDescriptor SystemIO::_open(const char* filename, int posix_open_flags) const { @@ -230,4 +227,4 @@ SocketDescriptor SystemIO::_accept(SocketDescriptor socket_fd, void* address, si return ::accept(socket_fd, static_cast<sockaddr*>(address), (int*)address_length); } -} \ No newline at end of file +} diff --git a/tests/system_io/ip_tcp_network_speedtest/ip_tcp_network_speedtest.cpp b/tests/system_io/ip_tcp_network_speedtest/ip_tcp_network_speedtest.cpp index 83b1e3c80c7019719dfc6931969c81a36ac49183..736ea629c25f0f76ee4d9b3490d04e6f4ddef025 100644 --- a/tests/system_io/ip_tcp_network_speedtest/ip_tcp_network_speedtest.cpp +++ b/tests/system_io/ip_tcp_network_speedtest/ip_tcp_network_speedtest.cpp @@ -21,7 +21,7 @@ static const std::string kListenAddress = "127.0.0.1:4206"; static std::promise<void> kThreadStarted; static size_t kTestSize = size_t(1024) * size_t(1024) * size_t(512); //512MiByte -static int kTestCount = 50; +static int kTestCount = 20; void Exit(int exit_number) { std::cerr << "ERROR: Exit on " << exit_number << std::endl; @@ -87,7 +87,8 @@ void Speedtest() { high_resolution_clock::time_point t2 = high_resolution_clock::now(); double tookMs = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 ).count(); - std::cout << i << ":\t" << std::setprecision(2) << std::fixed << (kTestSize / (tookMs / 1000)) / 1024 / 1024 / 1024 << " GiByte/s" << + std::cout << i << ":\t" << std::setprecision(2) << std::fixed << (kTestSize / (tookMs / 1000)) / 1024 / 1024 / 1024 << + " GiByte/s" << std::endl; /* << "\t"<< std::fixed << kTestSize/(tookMs/1000) << " Byte/s" << std::endl