Skip to content

Commit 871d746

Browse files
committed
Change to use epoll
1 parent 4630104 commit 871d746

File tree

8 files changed

+2610
-138
lines changed

8 files changed

+2610
-138
lines changed

CMakeLists.txt

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
55
set(CMAKE_CXX_EXTENSIONS OFF)
66

77
set(BUILD_VERSION 0.1.0.0)
8-
project(slick_socket VERSION ${BUILD_VERSION} LANGUAGES CXX)
8+
project(slick_socket VERSION ${BUILD_VERSION} LANGUAGES C CXX)
99

1010
if (NOT CMAKE_BUILD_TYPE)
1111
set(CMAKE_BUILD_TYPE Release)
@@ -47,17 +47,23 @@ if (MSVC)
4747
set(CMAKE_SUPPRESS_REGENERATION true) # supress zero_check project
4848
endif()
4949

50-
add_library(slick_socket INTERFACE)
51-
target_include_directories(slick_socket INTERFACE
52-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
53-
$<INSTALL_INTERFACE:include>
54-
)
55-
5650
if(WIN32)
57-
target_compile_definitions(slick_socket INTERFACE _WIN32_WINNT=0x0601)
58-
target_link_libraries(slick_socket INTERFACE ws2_32)
51+
add_library(slick_socket STATIC src/wepoll.c)
52+
set_target_properties(slick_socket PROPERTIES
53+
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
54+
)
55+
target_include_directories(slick_socket PUBLIC
56+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
57+
$<INSTALL_INTERFACE:include>
58+
)
59+
target_compile_definitions(slick_socket PUBLIC _WIN32_WINNT=0x0601)
60+
target_link_libraries(slick_socket PUBLIC ws2_32)
5961
elseif(UNIX)
60-
# Unix doesn't need additional libraries for basic socket operations
62+
add_library(slick_socket INTERFACE)
63+
target_include_directories(slick_socket INTERFACE
64+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
65+
$<INSTALL_INTERFACE:include>
66+
)
6167
endif()
6268

6369
option(BUILD_SLICK_SOCKET_EXAMPLES "Build tests" ON)
@@ -75,6 +81,9 @@ endif()
7581

7682
# Installation rules
7783
install(DIRECTORY include/ DESTINATION include)
84+
if (WIN32)
85+
install(DIRECTORY ${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}/ DESTINATION lib)
86+
endif()
7887

7988
# Automatically run install after build in Release mode
8089
if(CMAKE_BUILD_TYPE STREQUAL "Release")
@@ -86,7 +95,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release")
8695

8796
if (PROJECT_IS_TOP_LEVEL)
8897
add_custom_target(package_slick_socket ALL
89-
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include"
98+
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include" "lib"
9099
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dist"
91100
COMMENT "Creating zip archive"
92101
)

examples/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ target_include_directories(tcp_server_example
77
${CMAKE_SOURCE_DIR}/include
88
${CMAKE_CURRENT_SOURCE_DIR})
99

10+
target_link_libraries(tcp_server_example PRIVATE slick_socket)
11+
1012
add_executable(tcp_client_example
1113
tcp_client_example.cpp
1214
)
@@ -16,6 +18,8 @@ target_include_directories(tcp_client_example
1618
${CMAKE_SOURCE_DIR}/include
1719
${CMAKE_CURRENT_SOURCE_DIR})
1820

21+
target_link_libraries(tcp_client_example PRIVATE slick_socket)
22+
1923
add_executable(multicast_sender_example
2024
multicast_sender_example.cpp
2125
)

include/slick_socket/tcp_client_win32.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ inline bool TCPClientBase<DerivedT, LoggerT>::connect()
107107
client_thread_ = std::thread(&TCPClientBase::client_loop, this);
108108

109109
derived().onConnected();
110-
logger_.logInfo("Successfully connected to server");
111110
return true;
112111
}
113112

include/slick_socket/tcp_server.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct TCPServerConfig
2727
int cpu_affinity = -1; // -1 means no affinity, otherwise specify CPU core index
2828
};
2929

30-
template<typename DrivedT, typename LoggerT = ConsoleLogger>
30+
template<typename DerivedT, typename LoggerT = ConsoleLogger>
3131
class TCPServerBase
3232
{
3333
public:
@@ -52,8 +52,8 @@ class TCPServerBase
5252
}
5353

5454
protected:
55-
DrivedT& derived() { return static_cast<DrivedT&>(*this); }
56-
const DrivedT& derived() const { return static_cast<const DrivedT&>(*this); }
55+
DerivedT& derived() { return static_cast<DerivedT&>(*this); }
56+
const DerivedT& derived() const { return static_cast<const DerivedT&>(*this); }
5757

5858
void server_loop();
5959
void accept_new_client();
@@ -75,8 +75,6 @@ class TCPServerBase
7575
return clients_.size();
7676
}
7777

78-
protected:
79-
8078
#if defined(_WIN32) || defined(_WIN64)
8179
using SocketT = SOCKET;
8280
static constexpr SocketT invalid_socket = INVALID_SOCKET;
@@ -85,6 +83,10 @@ class TCPServerBase
8583
static constexpr SocketT invalid_socket = -1;
8684
#endif
8785

86+
void close_socket(SocketT socket);
87+
88+
protected:
89+
8890
struct ClientInfo
8991
{
9092
SocketT socket;
@@ -99,7 +101,14 @@ class TCPServerBase
99101
std::thread server_thread_;
100102
SocketT server_socket_ = invalid_socket;
101103

104+
#if !defined(_WIN32) && !defined(_WIN64)
105+
int epoll_fd_ = -1; // epoll file descriptor for Unix/Linux
106+
#else
107+
HANDLE epoll_fd_ = nullptr; // wepoll handle for Windows (epoll-like API)
108+
#endif
109+
102110
std::unordered_map<int, ClientInfo> clients_;
111+
std::unordered_map<SocketT, int> socket_to_client_id_;
103112
std::atomic<int> next_client_id_{1};
104113
};
105114

0 commit comments

Comments
 (0)