diff --git a/CMakeLists.txt b/CMakeLists.txt index ba4b1b7d8..42b244b27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,24 +19,39 @@ if(HAVE_RECVMMSG_API) add_definitions(-DHAVE_RECVMMSG_API) endif() - +# check the socket buffer size set by the upper cmake project, if it is set, use the setting of the upper cmake project, otherwise set it to 256K +# if the socket buffer size is set to 0, it means that the socket buffer size is not set, and the kernel default value is used(just for linux) +if(DEFINED SOCKET_DEFAULT_BUF_SIZE) + if (SOCKET_DEFAULT_BUF_SIZE EQUAL 0) + message(STATUS "Socket default buffer size is not set, use the kernel default value") + else() + message(STATUS "Socket default buffer size is set to ${SOCKET_DEFAULT_BUF_SIZE}") + endif () + add_definitions(-DSOCKET_DEFAULT_BUF_SIZE=${SOCKET_DEFAULT_BUF_SIZE}) +endif() #加载自定义模块 +#Load custom modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") #设置库文件路径 +#Set the library file path set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #设置可执行程序路径 +#Set the executable program path set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #设置子目录 +#Set subdirectories set(SUB_DIR_LIST "Network" "Poller" "Thread" "Util") if(WIN32) list(APPEND SUB_DIR_LIST "win32") #防止Windows.h包含Winsock.h + #Prevent Windows.h from including Winsock.h add_definitions(-DWIN32_LEAN_AND_MEAN) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) endif() #安装目录 +#Installation directory if(WIN32) set(INSTALL_PATH_LIB $ENV{HOME}/${PROJECT_NAME}/lib) set(INSTALL_PATH_INCLUDE $ENV{HOME}/${PROJECT_NAME}/include) @@ -47,12 +62,15 @@ endif() foreach(SUB_DIR ${SUB_DIR_LIST}) #遍历源文件 + #Traverse source file aux_source_directory(src/${SUB_DIR} SRC_LIST) #安装头文件至系统目录 + #Install header file to system directory install(DIRECTORY src/${SUB_DIR} DESTINATION ${INSTALL_PATH_INCLUDE} FILES_MATCHING PATTERN "*.h") endforeach() #非苹果平台移除.mm类型的文件 +#Remove .mm type files from non-apple platforms if(NOT APPLE) list(REMOVE_ITEM SRC_LIST "src/Network/Socket_ios.mm") endif() @@ -69,6 +87,7 @@ set(ENABLE_MYSQL ON CACHE BOOL "enable mysql") #查找openssl是否安装 +#Find out if openssl is installed find_package(OpenSSL QUIET) if(OPENSSL_FOUND AND ENABLE_OPENSSL) message(STATUS "找到openssl库:\"${OPENSSL_INCLUDE_DIR}\",ENABLE_OPENSSL宏已打开") @@ -78,6 +97,7 @@ if(OPENSSL_FOUND AND ENABLE_OPENSSL) endif() #查找mysql是否安装 +#Find out if mysql is installed find_package(MYSQL QUIET) if(MYSQL_FOUND AND ENABLE_MYSQL) message(STATUS "找到mysqlclient库:\"${MYSQL_INCLUDE_DIR}\",ENABLE_MYSQL宏已打开") @@ -88,8 +108,10 @@ if(MYSQL_FOUND AND ENABLE_MYSQL) endif() #打印库文件 +#Print library files message(STATUS "将链接依赖库:${LINK_LIB_LIST}") #使能c++11 +#Enable c++11 set(CMAKE_CXX_STANDARD 11) if(NOT WIN32) @@ -98,6 +120,7 @@ if(NOT WIN32) endif() #编译动态库 +#Compile dynamic library if(NOT IOS AND NOT ANDROID AND NOT WIN32) add_library(${PROJECT_NAME}_shared SHARED ${SRC_LIST}) target_include_directories(${PROJECT_NAME}_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -107,15 +130,19 @@ if(NOT IOS AND NOT ANDROID AND NOT WIN32) endif() #编译静态库 +#Compile static library add_library(${PROJECT_NAME}_static STATIC ${SRC_LIST}) #引用头文件路径 +#Reference header file path target_include_directories(${PROJECT_NAME}_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) set_target_properties(${PROJECT_NAME}_static PROPERTIES OUTPUT_NAME "${PROJECT_NAME}") #安装静态库至系统目录 +#Install static library to system directory install(TARGETS ${PROJECT_NAME}_static ARCHIVE DESTINATION ${INSTALL_PATH_LIB}) #测试程序 +#Test program if(NOT IOS) add_subdirectory(tests) endif() diff --git a/src/Network/Socket.cpp b/src/Network/Socket.cpp index cb47b2492..bb8afc06c 100644 --- a/src/Network/Socket.cpp +++ b/src/Network/Socket.cpp @@ -31,6 +31,7 @@ static SockException toSockException(int error) { case UV_EAGAIN: return SockException(Err_success, "success"); case UV_ECONNREFUSED: return SockException(Err_refused, uv_strerror(error), error); case UV_ETIMEDOUT: return SockException(Err_timeout, uv_strerror(error), error); + case UV_ECONNRESET: return SockException(Err_reset, uv_strerror(error), error); default: return SockException(Err_other, uv_strerror(error), error); } } diff --git a/src/Network/Socket.h b/src/Network/Socket.h index c071730b9..15d3d34d1 100644 --- a/src/Network/Socket.h +++ b/src/Network/Socket.h @@ -51,13 +51,14 @@ namespace toolkit { //错误类型枚举 typedef enum { - Err_success = 0, //成功 + Err_success = 0, //成功 success Err_eof, //eof - Err_timeout, //超时 - Err_refused,//连接被拒绝 - Err_dns,//dns解析失败 - Err_shutdown,//主动关闭 - Err_other = 0xFF,//其他错误 + Err_timeout, //超时 socket timeout + Err_refused,//连接被拒绝 socket refused + Err_reset,//连接被重置 socket reset + Err_dns,//dns解析失败 dns resolve failed + Err_shutdown,//主动关闭 socket shutdown + Err_other = 0xFF,//其他错误 other error } ErrCode; //错误信息类 diff --git a/src/Network/sockutil.cpp b/src/Network/sockutil.cpp index 3670665d1..7778e2abc 100644 --- a/src/Network/sockutil.cpp +++ b/src/Network/sockutil.cpp @@ -279,6 +279,10 @@ int SockUtil::setNoBlocked(int fd, bool noblock) { } int SockUtil::setRecvBuf(int fd, int size) { + if (size <= 0) { + // use the system default value + return 0; + } int ret = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size)); if (ret == -1) { TraceL << "setsockopt SO_RCVBUF failed"; @@ -287,6 +291,9 @@ int SockUtil::setRecvBuf(int fd, int size) { } int SockUtil::setSendBuf(int fd, int size) { + if (size <= 0) { + return 0; + } int ret = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size)); if (ret == -1) { TraceL << "setsockopt SO_SNDBUF failed"; diff --git a/src/Network/sockutil.h b/src/Network/sockutil.h index 9fb1b0f95..9f7af5c1a 100644 --- a/src/Network/sockutil.h +++ b/src/Network/sockutil.h @@ -43,7 +43,17 @@ int ioctl(int fd, long cmd, u_long *ptr); int close(int fd); #endif // defined(_WIN32) +#if !defined(SOCKET_DEFAULT_BUF_SIZE) #define SOCKET_DEFAULT_BUF_SIZE (256 * 1024) +#else +#if SOCKET_DEFAULT_BUF_SIZE == 0 && !defined(__linux__) +// just for linux, because in some high-throughput environments, +// kernel control is more efficient and reasonable than program +// settings. For example, refer to cloudflare's blog +#undef SOCKET_DEFAULT_BUF_SIZE +#define SOCKET_DEFAULT_BUF_SIZE (256 * 1024) +#endif +#endif #define TCP_KEEPALIVE_INTERVAL 30 #define TCP_KEEPALIVE_PROBE_TIMES 9 #define TCP_KEEPALIVE_TIME 120