Skip to content

Commit

Permalink
Merge pull request #128 from zussel/feature/networking
Browse files Browse the repository at this point in the history
Feature/networking
  • Loading branch information
zussel committed Nov 17, 2020
2 parents e02c4c4 + 52e158a commit 1356aa5
Show file tree
Hide file tree
Showing 96 changed files with 8,441 additions and 33 deletions.
20 changes: 18 additions & 2 deletions .travis.yml
@@ -1,5 +1,4 @@
language: cpp
sudo: false
dist: xenial

os: linux
Expand All @@ -12,59 +11,77 @@ matrix:
include:
# - env: GCC_VERSION=4.9 BUILD_TYPE=Debug ARCH=32
# addons: { postgresql: "10" , apt: {packages: [g++-4.9-multilib,"linux-libc-dev:i386",postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}

- env: GCC_VERSION=4.9 BUILD_TYPE=Debug ARCH=64
compiler: gcc
addons: { apt: {packages: [g++-4.9] , sources: [ubuntu-toolchain-r-test]}}

# - env: GCC_VERSION=5 BUILD_TYPE=Debug ARCH=32
# addons: { postgresql: "10" , apt: {packages: [g++-5-multilib,"linux-libc-dev:i386",postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}
- env: GCC_VERSION=5 BUILD_TYPE=Debug ARCH=64
compiler: gcc
addons: { apt: {packages: [g++-5] , sources: [ubuntu-toolchain-r-test]}}
# - env: GCC_VERSION=6 BUILD_TYPE=Debug ARCH=32
# addons: { postgresql: "10" , apt: {packages: [g++-6-multilib,"linux-libc-dev:i386",postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}

- env: GCC_VERSION=6 BUILD_TYPE=Debug ARCH=64
compiler: gcc
addons: { apt: {packages: [g++-6] , sources: [ubuntu-toolchain-r-test]}}

# - env: GCC_VERSION=7 BUILD_TYPE=Debug ARCH=32
# addons: &gcc7_32 { postgresql: "10" , apt: {packages: [g++-7-multilib,rpm,doxygen,"linux-libc-dev:i386",postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}
# - env: GCC_VERSION=7 BUILD_TYPE=Release ARCH=32
# addons: *gcc7_32

- env: GCC_VERSION=7 BUILD_TYPE=Debug ARCH=64
compiler: gcc
addons: &gcc7_64 { apt: {packages: [g++-7,rpm,doxygen] , sources: [ubuntu-toolchain-r-test]}}
- env: GCC_VERSION=7 BUILD_TYPE=Release ARCH=64
compiler: gcc
addons: *gcc7_64

# - env: CLANG_VERSION=3.6 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-3.6,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}

- env: CLANG_VERSION=3.6 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-3.6]}}

# - env: CLANG_VERSION=3.7 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-3.7,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test,llvm-toolchain-precise-3.7]}}

- env: CLANG_VERSION=3.7 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-3.7]}}

# - env: CLANG_VERSION=3.8 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-3.8,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test]}}

- env: CLANG_VERSION=3.8 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-3.8]}}

# - env: CLANG_VERSION=3.9 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-3.9,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test,llvm-toolchain-trusty-3.9]}}

- env: CLANG_VERSION=3.9 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-3.9]}}

# - env: CLANG_VERSION=4.0 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-4.0,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test,llvm-toolchain-trusty-4.0]}}

- env: CLANG_VERSION=4.0 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-4.0]}}

# - env: CLANG_VERSION=5.0 BUILD_TYPE=Release ARCH=32
# addons: { postgresql: "10" , apt: {packages: [clang-5.0,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test,llvm-toolchain-trusty-5.0]}}

- env: CLANG_VERSION=5.0 BUILD_TYPE=Release ARCH=64
compiler: clang
addons: { apt: {packages: [clang-5.0]}}

# - env: CLANG_VERSION=6.0 BUILD_TYPE=Debug ARCH=32
# addons: &clang6_32 { postgresql: "10" , apt: {packages: [clang-6.0,libstdc++-6-dev,postgresql-10,postgresql-client-10] , sources: [ubuntu-toolchain-r-test,llvm-toolchain-trusty-6.0]}}
# - env: CLANG_VERSION=6.0 BUILD_TYPE=Release ARCH=32
Expand Down Expand Up @@ -169,7 +186,6 @@ deploy:
- "${RELEASE_TGZ_FILE}"
- "${RELEASE_DEB_FILE}"
- "${RELEASE_RPM_FILE}"
skip_cleanup: true
on:
tags: true
condition: "$GCC_VERSION = 7 && $BUILD_TYPE = Release"
Expand Down
18 changes: 11 additions & 7 deletions CMakeLists.txt
Expand Up @@ -13,11 +13,10 @@ SET(APP_VERSION "${APP_MAJOR_VERSION}.${APP_MINOR_VERSION}.${APP_PATCH_LEVEL}")

MESSAGE(STATUS "${PROJECT_NAME_UPPER} ${APP_VERSION}")


# Common compiler flags
# These are defined for clang/gcc compatibility.
# When non-compatible flags are implemented then we must specify them separately.
SET(GCC_CLANG_COMMON_FLAGS "-std=c++11 -Wall -Wextra -pedantic")
SET(GCC_CLANG_COMMON_FLAGS "-std=c++14 -Wall -Wextra -pedantic")
SET(GCC_CLANG_COMMON_FLAGS_DEBUG "-O0 -g -DDEBUG")
SET(GCC_CLANG_COMMON_FLAGS_RELEASE "-O1 -DNDEBUG")
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
Expand Down Expand Up @@ -46,7 +45,6 @@ ELSEIF(MSVC)
SET(CMAKE_CXX_FLAGS_RELEASE "/O1 /DNDEBUG")
ENDIF()


MESSAGE(STATUS "Architecture: ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_SYSTEM_NAME}")

SET(SYSTEM_NAME_LOWER)
Expand All @@ -63,24 +61,30 @@ ELSE()
ENDIF()

OPTION(COVERAGE "Enable generation of code coverage" false)
IF (NOT COVERAGE_TESTS)
SET(COVERAGE_TESTS "all")
ENDIF()

OPTION(ARCH "Compiler architecture for Clang/GCC" "")

FIND_PACKAGE( Threads REQUIRED )

if (NOT MSVC AND (COVERAGE) AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT CMAKE_CXX_COMPILER MATCHES "clang")
MESSAGE(STATUS "coverage for compiler ${CMAKE_CXX_COMPILER}")
MESSAGE(STATUS "coverage tests are: ${COVERAGE_TESTS}")

SET(GCOV_BINARY "gcov" CACHE STRING "gcov binary")

MESSAGE(STATUS "gcov binary: ${GCOV_BINARY}")

INCLUDE(CodeCoverage)
MESSAGE(STATUS "will generate coverage data")
SET(CMAKE_BUILD_TYPE "Debug")
SET(GCOV_ADDITIONAL_FLAGS "-fprofile-arcs -ftest-coverage")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCOV_ADDITIONAL_FLAGS}")
SET(CMAKE_C_FLAGS "{CMAKE_C_FLAGS} ${GCOV_ADDITIONAL_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${GCOV_ADDITIONAL_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${GCOV_ADDITIONAL_FLAGS} ")

SETUP_TARGET_FOR_COVERAGE(coverage test_matador src coverage "exec;all")
SETUP_TARGET_FOR_COVERAGE(coverage test_matador src coverage "exec;${COVERAGE_TESTS}")
else()
MESSAGE(STATUS "no coverage for compiler ${CMAKE_CXX_COMPILER}")
endif()
Expand Down Expand Up @@ -167,10 +171,10 @@ MESSAGE( STATUS "CMAKE_BINARY_DIR: " ${CMAKE_BINARY_DIR} )

ENABLE_TESTING()


ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(doc)
ADD_SUBDIRECTORY(test)
ADD_SUBDIRECTORY(examples)
ADD_SUBDIRECTORY(sandbox)

INSTALL(
Expand Down
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -29,6 +29,8 @@ Features:
* Filter with simple expressions
* Transactions
* STL like interface and iterators
* Json support including parser and object mapper
* Simple Logging mechanism

Supported databases:
* PostgreSQL
Expand Down
1 change: 1 addition & 0 deletions examples/CMakeLists.txt
@@ -0,0 +1 @@
ADD_SUBDIRECTORY(net)
41 changes: 41 additions & 0 deletions examples/net/CMakeLists.txt
@@ -0,0 +1,41 @@
SET(NET_LIBRARIES)

IF(WIN32)
MESSAGE(STATUS "Appending Windows Socket libs: wsock32 ws2_32")
LIST(APPEND NET_LIBRARIES wsock32 ws2_32)
ENDIF()

# echo server example

SET (ECHO_SERVER_SOURCES
echo_server_main.cpp
echo_server_connection.cpp
echo_server_connection.hpp
echo_server.cpp echo_server.hpp)

ADD_EXECUTABLE(echo_server ${ECHO_SERVER_SOURCES})

TARGET_LINK_LIBRARIES(echo_server
matador-unit
matador-utils
matador-logger
matador-net
${CMAKE_DL_LIBS}
${NET_LIBRARIES}
)

# echo client example

SET (ECHO_CLIENT_SOURCES
echo_client_main.cpp echo_client_connection.cpp echo_client_connection.hpp echo_client.cpp echo_client.hpp)

ADD_EXECUTABLE(echo_client ${ECHO_CLIENT_SOURCES})

TARGET_LINK_LIBRARIES(echo_client
matador-unit
matador-utils
matador-logger
matador-net
${CMAKE_DL_LIBS}
${NET_LIBRARIES}
)
28 changes: 28 additions & 0 deletions examples/net/echo_client.cpp
@@ -0,0 +1,28 @@
#include "echo_client.hpp"
#include "echo_client_connection.hpp"

using namespace matador;

echo_client::echo_client(std::string port)
: connector_(std::make_shared<matador::connector>())
, port_(std::move(port))
{
matador::add_log_sink(matador::create_file_sink("log/client.log"));
matador::add_log_sink(matador::create_stdout_sink());

prepare_connect();
}

void echo_client::run()
{
service_.run();
}

void echo_client::prepare_connect()
{
service_.connect(connector_, port_, [](tcp::peer ep, io_stream &stream) {
// create echo server connection
auto conn = std::make_shared<echo_client_connection>(stream, std::move(ep));
conn->start();
});
}
25 changes: 25 additions & 0 deletions examples/net/echo_client.hpp
@@ -0,0 +1,25 @@
#ifndef MATADOR_ECHO_CLIENT_HPP
#define MATADOR_ECHO_CLIENT_HPP

#include <string>
#include <matador/net/connector.hpp>
#include <matador/logger/log_manager.hpp>
#include <matador/net/io_service.hpp>

class echo_client
{
public:
explicit echo_client(std::string port);

void run();

private:
void prepare_connect();
private:
matador::io_service service_;
std::shared_ptr<matador::connector> connector_;
std::string port_;
};


#endif //MATADOR_ECHO_CLIENT_HPP
48 changes: 48 additions & 0 deletions examples/net/echo_client_connection.cpp
@@ -0,0 +1,48 @@
#include <matador/logger/log_manager.hpp>
#include <iostream>
#include "echo_client_connection.hpp"

using namespace matador;

echo_client_connection::echo_client_connection(matador::io_stream &stream, matador::tcp::peer endpoint)
: log_(create_logger("EchoClientConnection"))
, stream_(stream)
, endpoint_(std::move(endpoint))
{}

void echo_client_connection::start()
{
write();
}

void echo_client_connection::read()
{
auto self(shared_from_this());
stream_.read(buf_, [this, self](int ec, int nread) {
if (ec == 0) {
std::cout << "Answer (size " << nread << "): " << std::string(buf_.data(), buf_.size()) << "\n";
buf_.clear();
write();
}
});
}

void echo_client_connection::write()
{
std::cout << "Message: ";
std::string message;
std::cin >> message;
if (message == "exit") {
stream_.close_stream();
return;
}
buf_.append(message.c_str(), message.size());
auto self(shared_from_this());
stream_.write(buf_, [this, self](int ec, int nwrite) {
if (ec == 0) {
log_.info("%s sent (bytes: %d)", endpoint_.to_string().c_str(), nwrite);
buf_.clear();
read();
}
});
}
27 changes: 27 additions & 0 deletions examples/net/echo_client_connection.hpp
@@ -0,0 +1,27 @@
#ifndef MATADOR_ECHO_CLIENT_CONNECTION_HPP
#define MATADOR_ECHO_CLIENT_CONNECTION_HPP

#include <memory>
#include <matador/net/io_stream.hpp>
#include <matador/utils/buffer.hpp>

class echo_client_connection : public std::enable_shared_from_this<echo_client_connection>
{
public:
explicit echo_client_connection(matador::io_stream &stream, matador::tcp::peer endpoint);

void start();

void read();

void write();

private:
matador::logger log_;
matador::buffer buf_;
matador::io_stream &stream_;
matador::tcp::peer endpoint_;
};


#endif //MATADOR_ECHO_CLIENT_CONNECTION_HPP
22 changes: 22 additions & 0 deletions examples/net/echo_client_main.cpp
@@ -0,0 +1,22 @@
#include <iostream>
#include <matador/net/os.hpp>
#include "echo_client.hpp"

using namespace matador;

int main(int argc, char* argv[])
{
if (argc < 2) {
std::cout << "usage: echo_client [port]\n";
return 1;
} else {

net::init();

echo_client client(argv[1]);

client.run();

net::cleanup();
}
}
30 changes: 30 additions & 0 deletions examples/net/echo_server.cpp
@@ -0,0 +1,30 @@
#include <matador/net/acceptor.hpp>
#include <matador/logger/log_manager.hpp>
#include <matador/net/io_stream.hpp>
#include "echo_server.hpp"
#include "echo_server_connection.hpp"

using namespace matador;

echo_server::echo_server(unsigned short port)
: acceptor_(std::make_shared<acceptor>(tcp::peer(address::v4::any(), port)))
{
matador::add_log_sink(matador::create_file_sink("log/server.log"));
matador::add_log_sink(matador::create_stdout_sink());

prepare_accept();
}

void echo_server::run()
{
service_.run();
}

void echo_server::prepare_accept()
{
service_.accept(acceptor_, [](tcp::peer ep, io_stream &stream) {
// create echo server connection
auto conn = std::make_shared<echo_server_connection>(stream, std::move(ep));
conn->start();
});
}

0 comments on commit 1356aa5

Please sign in to comment.