├── Service ├── build │ ├── CMakeFiles │ │ ├── progress.marks │ │ ├── cmake.check_cache │ │ ├── feature_tests.bin │ │ ├── 3.10.2 │ │ │ ├── CompilerIdC │ │ │ │ └── a.out │ │ │ ├── CompilerIdCXX │ │ │ │ ├── a.out │ │ │ │ └── CMakeCXXCompilerId.cpp │ │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ │ ├── CMakeSystem.cmake │ │ │ ├── CMakeCCompiler.cmake │ │ │ └── CMakeCXXCompiler.cmake │ │ ├── TargetDirectories.txt │ │ ├── CMakeDirectoryInformation.cmake │ │ ├── feature_tests.c │ │ ├── Makefile.cmake │ │ ├── Makefile2 │ │ └── feature_tests.cxx │ ├── src │ │ ├── CMakeFiles │ │ │ ├── progress.marks │ │ │ └── CMakeDirectoryInformation.cmake │ │ ├── client │ │ │ ├── CMakeFiles │ │ │ │ ├── progress.marks │ │ │ │ ├── ChatClient.dir │ │ │ │ │ ├── progress.make │ │ │ │ │ ├── link.txt │ │ │ │ │ ├── main.cpp.o │ │ │ │ │ ├── cmake_clean.cmake │ │ │ │ │ ├── depend.internal │ │ │ │ │ ├── flags.make │ │ │ │ │ ├── depend.make │ │ │ │ │ ├── DependInfo.cmake │ │ │ │ │ ├── CXX.includecache │ │ │ │ │ └── build.make │ │ │ │ └── CMakeDirectoryInformation.cmake │ │ │ ├── cmake_install.cmake │ │ │ └── Makefile │ │ ├── server │ │ │ ├── CMakeFiles │ │ │ │ ├── progress.marks │ │ │ │ ├── ChatServer.dir │ │ │ │ │ ├── main.cpp.o │ │ │ │ │ ├── ChatServer.cpp.o │ │ │ │ │ ├── ChatService.cpp.o │ │ │ │ │ ├── redis │ │ │ │ │ │ └── Redis.cpp.o │ │ │ │ │ ├── model │ │ │ │ │ │ ├── UserModel.cpp.o │ │ │ │ │ │ ├── FriendModel.cpp.o │ │ │ │ │ │ ├── GroupModel.cpp.o │ │ │ │ │ │ └── OfflineMessageModel.cpp.o │ │ │ │ │ ├── progress.make │ │ │ │ │ ├── flags.make │ │ │ │ │ ├── link.txt │ │ │ │ │ ├── cmake_clean.cmake │ │ │ │ │ ├── DependInfo.cmake │ │ │ │ │ ├── depend.internal │ │ │ │ │ ├── depend.make │ │ │ │ │ └── CXX.includecache │ │ │ │ └── CMakeDirectoryInformation.cmake │ │ │ ├── cmake_install.cmake │ │ │ └── Makefile │ │ ├── cmake_install.cmake │ │ └── Makefile │ ├── cmake_install.cmake │ ├── compile_commands.json │ ├── Makefile │ └── CMakeCache.txt ├── src │ ├── CMakeLists.txt │ ├── client │ │ ├── CMakeLists.txt │ │ └── main.cpp │ └── server │ │ ├── CMakeLists.txt │ │ ├── main.cpp │ │ ├── model │ │ ├── FriendModel.cpp │ │ ├── OfflineMessageModel.cpp │ │ ├── UserModel.cpp │ │ └── GroupModel.cpp │ │ ├── ChatServer.cpp │ │ ├── redis │ │ └── Redis.cpp │ │ └── ChatService.cpp ├── bin │ ├── ChatClient │ └── ChatServer ├── other │ ├── DataBase.h │ ├── muduo_server.cpp │ └── CMakeLists.txt ├── include │ ├── server │ │ ├── model │ │ │ ├── FriendModel.hpp │ │ │ ├── GroupUser.hpp │ │ │ ├── UserModel.hpp │ │ │ ├── OfflineMessageModel.hpp │ │ │ ├── GroupModel.hpp │ │ │ ├── Group.hpp │ │ │ └── User.hpp │ │ ├── ChatServer.hpp │ │ ├── redis │ │ │ └── Redis.hpp │ │ ├── db │ │ │ └── MySQL.hpp │ │ └── ChatService.hpp │ └── public.hpp ├── .vscode │ └── c_cpp_properties.json └── CMakeLists.txt └── README.md /Service/build/CMakeFiles/progress.marks: -------------------------------------------------------------------------------- 1 | 11 2 | -------------------------------------------------------------------------------- /Service/build/src/CMakeFiles/progress.marks: -------------------------------------------------------------------------------- 1 | 11 2 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/progress.marks: -------------------------------------------------------------------------------- 1 | 2 2 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/progress.marks: -------------------------------------------------------------------------------- 1 | 9 2 | -------------------------------------------------------------------------------- /Service/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_subdirectory(server) 2 | add_subdirectory(client) -------------------------------------------------------------------------------- /Service/bin/ChatClient: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/bin/ChatClient -------------------------------------------------------------------------------- /Service/bin/ChatServer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/bin/ChatServer -------------------------------------------------------------------------------- /Service/other/DataBase.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/other/DataBase.h -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/progress.make: -------------------------------------------------------------------------------- 1 | CMAKE_PROGRESS_1 = 1 2 | CMAKE_PROGRESS_2 = 2 3 | 4 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/cmake.check_cache: -------------------------------------------------------------------------------- 1 | # This file is generated by cmake for dependency checking of the CMakeCache.txt file 2 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/feature_tests.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/CMakeFiles/feature_tests.bin -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CompilerIdC/a.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/CMakeFiles/3.10.2/CompilerIdC/a.out -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CompilerIdCXX/a.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/CMakeFiles/3.10.2/CompilerIdCXX/a.out -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/link.txt: -------------------------------------------------------------------------------- 1 | /usr/bin/g++-7 -g -g -rdynamic CMakeFiles/ChatClient.dir/main.cpp.o -o ../../../bin/ChatClient -lpthread 2 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/main.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/client/CMakeFiles/ChatClient.dir/main.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/main.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/main.cpp.o -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenmingik/Server/HEAD/Service/build/src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o -------------------------------------------------------------------------------- /Service/src/client/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 定义了SRC_LIST变量,包含当前目录下所有的源文件 2 | aux_source_directory(. SRC_LIST) 3 | 4 | # 指定生成可执行文件 5 | add_executable(ChatClient ${SRC_LIST}) 6 | # 指定可执行文件链接时需要的库文件 7 | target_link_libraries(ChatClient pthread) -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/progress.make: -------------------------------------------------------------------------------- 1 | CMAKE_PROGRESS_1 = 3 2 | CMAKE_PROGRESS_2 = 4 3 | CMAKE_PROGRESS_3 = 5 4 | CMAKE_PROGRESS_4 = 6 5 | CMAKE_PROGRESS_5 = 7 6 | CMAKE_PROGRESS_6 = 8 7 | CMAKE_PROGRESS_7 = 9 8 | CMAKE_PROGRESS_8 = 10 9 | CMAKE_PROGRESS_9 = 11 10 | 11 | -------------------------------------------------------------------------------- /Service/src/server/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 定义了SRC_LIST变量,包含当前目录下所有的源文件 2 | aux_source_directory(. SRC_LIST) 3 | aux_source_directory(./model MODEL_LIST) 4 | aux_source_directory(./redis REDIS_LIST) 5 | 6 | # 指定生成可执行文件 7 | add_executable(ChatServer ${SRC_LIST} ${MODEL_LIST} ${REDIS_LIST}) 8 | # 指定可执行文件链接时需要的库文件 9 | target_link_libraries(ChatServer muduo_net muduo_base mysqlclient hiredis pthread) -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/cmake_clean.cmake: -------------------------------------------------------------------------------- 1 | file(REMOVE_RECURSE 2 | "CMakeFiles/ChatClient.dir/main.cpp.o" 3 | "../../../bin/ChatClient.pdb" 4 | "../../../bin/ChatClient" 5 | ) 6 | 7 | # Per-language clean rules from dependency scanning. 8 | foreach(lang CXX) 9 | include(CMakeFiles/ChatClient.dir/cmake_clean_${lang}.cmake OPTIONAL) 10 | endforeach() 11 | -------------------------------------------------------------------------------- /Service/include/server/model/FriendModel.hpp: -------------------------------------------------------------------------------- 1 | #ifndef FRIENDMODEL_H 2 | #define FRIENDMODEL_H 3 | 4 | #include 5 | #include "User.hpp" 6 | 7 | using namespace std; 8 | 9 | //维护好友信息的结构方法 10 | class FriendModel 11 | { 12 | public: 13 | //添加好友关系 14 | bool insert(int user_id, int friend_id); 15 | 16 | //返回用户好友列表 17 | vector query(int user_id); 18 | }; 19 | 20 | #endif -------------------------------------------------------------------------------- /Service/include/server/model/GroupUser.hpp: -------------------------------------------------------------------------------- 1 | #ifndef GROUPUSER_H 2 | #define GROUPUSER_H 3 | 4 | #include "User.hpp" 5 | 6 | class GroupUser : public User 7 | { 8 | public: 9 | void set_role(string role) 10 | { 11 | role_ = role; 12 | } 13 | 14 | string get_role() 15 | { 16 | return role_; 17 | } 18 | 19 | private: 20 | string role_; 21 | }; 22 | #endif -------------------------------------------------------------------------------- /Service/other/muduo_server.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | 6 | class Hello 7 | { 8 | public: 9 | void say(string name) 10 | { cout << name << " say: hello world!" << endl; } 11 | }; 12 | 13 | int main() 14 | { 15 | 16 | Hello h; 17 | auto func = boost::bind(&Hello::say, &h, "zhang san"); 18 | func(); 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Service/include/server/model/UserModel.hpp: -------------------------------------------------------------------------------- 1 | #ifndef USERMODEL_H 2 | #define USERMODEL_H 3 | 4 | #include "User.hpp" 5 | 6 | //User表的数据操作类 7 | class UserModel 8 | { 9 | public: 10 | //增加User 11 | bool insert(User &user); 12 | 13 | //根据ID查询user信息 14 | User query(int id); 15 | 16 | //更新状态操作 17 | bool update_state(User user); 18 | 19 | //重置用户状态信息 20 | bool reset_state(); 21 | }; 22 | #endif -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/depend.internal: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o 5 | ../include/public.hpp 6 | ../include/server/model/Group.hpp 7 | ../include/server/model/GroupUser.hpp 8 | ../include/server/model/User.hpp 9 | ../thirdparty/json.hpp 10 | /home/ik/桌面/Service/src/client/main.cpp 11 | -------------------------------------------------------------------------------- /Service/.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Linux", 5 | "includePath": [ 6 | "${workspaceFolder}/**" 7 | ], 8 | "defines": [], 9 | "compilerPath": "/usr/bin/gcc", 10 | "cStandard": "gnu11", 11 | "cppStandard": "gnu++14", 12 | "intelliSenseMode": "gcc-x64" 13 | } 14 | ], 15 | "version": 4 16 | } -------------------------------------------------------------------------------- /Service/include/server/model/OfflineMessageModel.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OFFLINEMESSAGEMODEL_H 2 | #define OFFLINEMESSAGEMODEL_H 3 | 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | 9 | //关于offlinemessage表的操作 10 | class OfflineMessageModel 11 | { 12 | public: 13 | //存储用户的离线消息 14 | bool insert(int id, string msg); 15 | 16 | //删除用户的离线消息 17 | bool remove(int id); 18 | 19 | //查询用户的聊天消息 20 | vector query(int id); 21 | }; 22 | #endif -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CMakeSystem.cmake: -------------------------------------------------------------------------------- 1 | set(CMAKE_HOST_SYSTEM "Linux-5.4.0-62-generic") 2 | set(CMAKE_HOST_SYSTEM_NAME "Linux") 3 | set(CMAKE_HOST_SYSTEM_VERSION "5.4.0-62-generic") 4 | set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") 5 | 6 | 7 | 8 | set(CMAKE_SYSTEM "Linux-5.4.0-62-generic") 9 | set(CMAKE_SYSTEM_NAME "Linux") 10 | set(CMAKE_SYSTEM_VERSION "5.4.0-62-generic") 11 | set(CMAKE_SYSTEM_PROCESSOR "x86_64") 12 | 13 | set(CMAKE_CROSSCOMPILING "FALSE") 14 | 15 | set(CMAKE_SYSTEM_LOADED 1) 16 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/flags.make: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # compile CXX with /usr/bin/g++-7 5 | CXX_FLAGS = -g -g 6 | 7 | CXX_DEFINES = 8 | 9 | CXX_INCLUDES = -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty 10 | 11 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/flags.make: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # compile CXX with /usr/bin/g++-7 5 | CXX_FLAGS = -g -g 6 | 7 | CXX_DEFINES = 8 | 9 | CXX_INCLUDES = -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty 10 | 11 | -------------------------------------------------------------------------------- /Service/include/public.hpp: -------------------------------------------------------------------------------- 1 | #ifndef PUBLIC_H 2 | #define PUBLIC_H 3 | 4 | /* 5 | * service和client的公共文件 6 | */ 7 | enum EnMsgType 8 | { 9 | LOGIN_MSG = 1, //登录消息,绑定login 10 | LOGIN_MSG_ACK, //登录响应消息 11 | REG_MSG, //注册消息,绑定regist 12 | REG_MSG_ACK, //注册响应消息 13 | ONE_CHAT_MSG, //一对一聊天消息 14 | ADD_FRIEND_MSG, //添加好友消息 15 | 16 | CREATE_GROUP_MSG, //创建群聊 17 | ADD_GROUP_MSG, //加入群聊 18 | GROUP_CHAT_MSG, //群聊消息 19 | 20 | LOGINOUT_MSG, //注销消息 21 | }; 22 | 23 | #endif -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/link.txt: -------------------------------------------------------------------------------- 1 | /usr/bin/g++-7 -g -g -rdynamic CMakeFiles/ChatServer.dir/ChatServer.cpp.o CMakeFiles/ChatServer.dir/ChatService.cpp.o CMakeFiles/ChatServer.dir/main.cpp.o CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o CMakeFiles/ChatServer.dir/model/UserModel.cpp.o CMakeFiles/ChatServer.dir/redis/Redis.cpp.o -o ../../../bin/ChatServer -lmuduo_net -lmuduo_base -lmysqlclient -lhiredis -lpthread 2 | -------------------------------------------------------------------------------- /Service/include/server/model/GroupModel.hpp: -------------------------------------------------------------------------------- 1 | #ifndef GROUPMODEL_H 2 | #define GROUPMODEL_H 3 | 4 | #include "Group.hpp" 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | class GroupModel 11 | { 12 | public: 13 | //创建群组 14 | bool create_group(Group &group); 15 | 16 | //加入群组 17 | bool add_group(int user_id, int group_id, string role); 18 | 19 | //查询用户所在群组信息 20 | vector query_group(int user_id); 21 | 22 | //根据指定的groupid查询群组用户id列表,除userid自己,给该群用户群发消息 23 | vector query_group_users(int user_id, int group_id); 24 | }; 25 | 26 | #endif -------------------------------------------------------------------------------- /Service/other/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 最小支持版本 2 | cmake_minimum_required(VERSION 3.0) 3 | # 项目名称 4 | project(main) 5 | 6 | # 编译选项 7 | set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g) 8 | 9 | # 头文件路径 10 | #include_directories() 11 | 12 | # 库文件路径 13 | #link_directories() 14 | 15 | # 设置源文件列表 16 | set(SRC_LIST ./muduo_server.cpp) 17 | 18 | # 设置可执行文件最终存储路径 19 | set(EXECUTABLE_OUTPUT_PATH ../bin) 20 | 21 | # 把当前所有文件放进SRC_LIST变量中 22 | aux_source_directory(. SRC_LIST) 23 | 24 | # 创建执行文件所需文件 25 | add_executable(server ${SRC_LIST}) 26 | 27 | # 所需库文件,需要连接muduo_net muduo_base pthread三个库 28 | target_link_libraries(server muduo_net muduo_base pthread) 29 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/depend.make: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../include/public.hpp 5 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../include/server/model/Group.hpp 6 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../include/server/model/GroupUser.hpp 7 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../include/server/model/User.hpp 8 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../thirdparty/json.hpp 9 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../src/client/main.cpp 10 | 11 | -------------------------------------------------------------------------------- /Service/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | project(chat) 3 | 4 | # 配置编译选项 5 | set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g) 6 | 7 | # 配置最终的可执行文件输出的路径 8 | set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 9 | 10 | # 配置头文件的搜索路径 11 | include_directories(${PROJECT_SOURCE_DIR}/include) 12 | include_directories(${PROJECT_SOURCE_DIR}/include/server) 13 | include_directories(${PROJECT_SOURCE_DIR}/include/server/db) 14 | include_directories(${PROJECT_SOURCE_DIR}/include/server/model) 15 | include_directories(${PROJECT_SOURCE_DIR}/include/server/redis) 16 | include_directories(${PROJECT_SOURCE_DIR}/thirdparty) 17 | 18 | # 加载子目录 19 | add_subdirectory(src) -------------------------------------------------------------------------------- /Service/build/CMakeFiles/TargetDirectories.txt: -------------------------------------------------------------------------------- 1 | /home/ik/桌面/Service/build/CMakeFiles/rebuild_cache.dir 2 | /home/ik/桌面/Service/build/CMakeFiles/edit_cache.dir 3 | /home/ik/桌面/Service/build/src/CMakeFiles/rebuild_cache.dir 4 | /home/ik/桌面/Service/build/src/CMakeFiles/edit_cache.dir 5 | /home/ik/桌面/Service/build/src/server/CMakeFiles/rebuild_cache.dir 6 | /home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir 7 | /home/ik/桌面/Service/build/src/server/CMakeFiles/edit_cache.dir 8 | /home/ik/桌面/Service/build/src/client/CMakeFiles/rebuild_cache.dir 9 | /home/ik/桌面/Service/build/src/client/CMakeFiles/ChatClient.dir 10 | /home/ik/桌面/Service/build/src/client/CMakeFiles/edit_cache.dir 11 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/CMakeDirectoryInformation.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Relative path conversion top directories. 5 | set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ik/桌面/Service") 6 | set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ik/桌面/Service/build") 7 | 8 | # Force unix paths in dependencies. 9 | set(CMAKE_FORCE_UNIX_PATHS 1) 10 | 11 | 12 | # The C and CXX include file regular expressions for this directory. 13 | set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") 14 | set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") 15 | set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) 16 | set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) 17 | -------------------------------------------------------------------------------- /Service/build/src/CMakeFiles/CMakeDirectoryInformation.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Relative path conversion top directories. 5 | set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ik/桌面/Service") 6 | set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ik/桌面/Service/build") 7 | 8 | # Force unix paths in dependencies. 9 | set(CMAKE_FORCE_UNIX_PATHS 1) 10 | 11 | 12 | # The C and CXX include file regular expressions for this directory. 13 | set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") 14 | set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") 15 | set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) 16 | set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) 17 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/CMakeDirectoryInformation.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Relative path conversion top directories. 5 | set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ik/桌面/Service") 6 | set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ik/桌面/Service/build") 7 | 8 | # Force unix paths in dependencies. 9 | set(CMAKE_FORCE_UNIX_PATHS 1) 10 | 11 | 12 | # The C and CXX include file regular expressions for this directory. 13 | set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") 14 | set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") 15 | set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) 16 | set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) 17 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/CMakeDirectoryInformation.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Relative path conversion top directories. 5 | set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ik/桌面/Service") 6 | set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ik/桌面/Service/build") 7 | 8 | # Force unix paths in dependencies. 9 | set(CMAKE_FORCE_UNIX_PATHS 1) 10 | 11 | 12 | # The C and CXX include file regular expressions for this directory. 13 | set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") 14 | set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") 15 | set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) 16 | set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) 17 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/cmake_clean.cmake: -------------------------------------------------------------------------------- 1 | file(REMOVE_RECURSE 2 | "CMakeFiles/ChatServer.dir/ChatServer.cpp.o" 3 | "CMakeFiles/ChatServer.dir/ChatService.cpp.o" 4 | "CMakeFiles/ChatServer.dir/main.cpp.o" 5 | "CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o" 6 | "CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o" 7 | "CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o" 8 | "CMakeFiles/ChatServer.dir/model/UserModel.cpp.o" 9 | "CMakeFiles/ChatServer.dir/redis/Redis.cpp.o" 10 | "../../../bin/ChatServer.pdb" 11 | "../../../bin/ChatServer" 12 | ) 13 | 14 | # Per-language clean rules from dependency scanning. 15 | foreach(lang CXX) 16 | include(CMakeFiles/ChatServer.dir/cmake_clean_${lang}.cmake OPTIONAL) 17 | endforeach() 18 | -------------------------------------------------------------------------------- /Service/include/server/ChatServer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CHATSERVER_H 2 | #define CHATSERVER_H 3 | 4 | #include 5 | #include 6 | 7 | using namespace muduo; 8 | using namespace muduo::net; 9 | 10 | //聊天服务器主类 11 | class ChatServer 12 | { 13 | public: 14 | //初始化聊天服务器对象 15 | ChatServer(EventLoop *loop, const InetAddress &listenAddr, const string &nameArg); 16 | 17 | //启动服务 18 | void start(); 19 | 20 | private: 21 | //上报连接相关信息的回调函数 22 | void on_connection(const TcpConnectionPtr &); 23 | 24 | //上报读写时间相关信息的回调函数 25 | void on_message(const TcpConnectionPtr &, Buffer *, Timestamp); 26 | 27 | private: 28 | TcpServer server_; //组合的muduo库,实现服务器功能的类对象 29 | EventLoop *loop_; //指向事件循环对象的指针 30 | }; 31 | 32 | #endif -------------------------------------------------------------------------------- /Service/src/server/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "ChatServer.hpp" 4 | #include "ChatService.hpp" 5 | 6 | using namespace std; 7 | 8 | //处理服务器ctrl+c结束后,重置user的状态信息 9 | void reset_handler(int) 10 | { 11 | ChatService::instance()->reset(); 12 | exit(0); 13 | } 14 | 15 | int main(int argc, char **argv) 16 | { 17 | if (argc < 3) 18 | { 19 | cerr << "command invaild example: ./ExeNAME IpAddress port" << endl; 20 | exit(-1); 21 | } 22 | 23 | //解析IP地址和端口号 24 | char *ip = argv[1]; 25 | uint16_t port = atoi(argv[2]); 26 | 27 | signal(SIGINT, reset_handler); 28 | 29 | EventLoop loop; 30 | InetAddress addr(ip, port); 31 | ChatServer server(&loop, addr, "ChatServer"); 32 | 33 | server.start(); 34 | loop.loop(); 35 | 36 | return 0; 37 | } -------------------------------------------------------------------------------- /Service/build/CMakeFiles/feature_tests.c: -------------------------------------------------------------------------------- 1 | 2 | const char features[] = {"\n" 3 | "C_FEATURE:" 4 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 5 | "1" 6 | #else 7 | "0" 8 | #endif 9 | "c_function_prototypes\n" 10 | "C_FEATURE:" 11 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 12 | "1" 13 | #else 14 | "0" 15 | #endif 16 | "c_restrict\n" 17 | "C_FEATURE:" 18 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L 19 | "1" 20 | #else 21 | "0" 22 | #endif 23 | "c_static_assert\n" 24 | "C_FEATURE:" 25 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 26 | "1" 27 | #else 28 | "0" 29 | #endif 30 | "c_variadic_macros\n" 31 | 32 | }; 33 | 34 | int main(int argc, char** argv) { (void)argv; return features[argc]; } 35 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/DependInfo.cmake: -------------------------------------------------------------------------------- 1 | # The set of languages for which implicit dependencies are needed: 2 | set(CMAKE_DEPENDS_LANGUAGES 3 | "CXX" 4 | ) 5 | # The set of files for implicit dependencies of each language: 6 | set(CMAKE_DEPENDS_CHECK_CXX 7 | "/home/ik/桌面/Service/src/client/main.cpp" "/home/ik/桌面/Service/build/src/client/CMakeFiles/ChatClient.dir/main.cpp.o" 8 | ) 9 | set(CMAKE_CXX_COMPILER_ID "GNU") 10 | 11 | # The include file search paths: 12 | set(CMAKE_CXX_TARGET_INCLUDE_PATH 13 | "../include" 14 | "../include/server" 15 | "../include/server/db" 16 | "../include/server/model" 17 | "../include/server/redis" 18 | "../thirdparty" 19 | ) 20 | 21 | # Targets to which this target links. 22 | set(CMAKE_TARGET_LINKED_INFO_FILES 23 | ) 24 | 25 | # Fortran module output directory. 26 | set(CMAKE_Fortran_TARGET_MODULE_DIR "") 27 | -------------------------------------------------------------------------------- /Service/include/server/redis/Redis.hpp: -------------------------------------------------------------------------------- 1 | #ifndef REDIS_H 2 | #define REDIS_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | using redis_handler = function; 10 | 11 | class Redis 12 | { 13 | public: 14 | Redis(); 15 | ~Redis(); 16 | 17 | //连接Redis服务器 18 | bool connect(); 19 | 20 | //向Redis指定的通道channel发布消息 21 | bool publish(int channel, string message); 22 | 23 | //向Redis指定的通道subscribe订阅消息 24 | bool subscribe(int channel); 25 | 26 | //取消订阅 27 | bool unsubscribe(int channel); 28 | 29 | //独立线程中接收订阅通道的消息 30 | void observer_channel_message(); 31 | 32 | //初始化业务层上报通道消息的回调对象 33 | void init_notify_handler(redis_handler handler); 34 | 35 | private: 36 | //hiredis同步上下文对象,负责publish消息 37 | redisContext *publish_context_; 38 | 39 | //负责subscribe消息 40 | redisContext *subcribe_context_; 41 | 42 | //回调操作,收到消息给service上报 43 | redis_handler notify_message_handler_; 44 | }; 45 | 46 | #endif -------------------------------------------------------------------------------- /Service/include/server/model/Group.hpp: -------------------------------------------------------------------------------- 1 | #ifndef GROUP_H 2 | #define GROUP_H 3 | 4 | #include "GroupUser.hpp" 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | //Group表的ORM类 11 | class Group 12 | { 13 | public: 14 | Group(int id = -1, string name = "", string desc = "") 15 | { 16 | id_ = id; 17 | name_ = name; 18 | desc_ = desc; 19 | } 20 | 21 | void set_id(int id) 22 | { 23 | id_ = id; 24 | } 25 | 26 | void set_name(string name) 27 | { 28 | name_ = name; 29 | } 30 | 31 | void set_desc(string desc) 32 | { 33 | desc_ = desc; 34 | } 35 | 36 | int get_id() 37 | { 38 | return id_; 39 | } 40 | 41 | string get_name() 42 | { 43 | return name_; 44 | } 45 | 46 | string get_desc() 47 | { 48 | return desc_; 49 | } 50 | 51 | vector &get_User() 52 | { 53 | return user_; 54 | } 55 | 56 | private: 57 | int id_; 58 | string name_; 59 | string desc_; 60 | vector user_; 61 | }; 62 | 63 | #endif -------------------------------------------------------------------------------- /Service/include/server/model/User.hpp: -------------------------------------------------------------------------------- 1 | #ifndef USER_H 2 | #define USER_H 3 | 4 | #include 5 | using namespace std; 6 | 7 | class User 8 | { 9 | public: 10 | User(int id = -1, string name = "", string password = "", string state = "offline") 11 | { 12 | id_ = id; 13 | name_ = name; 14 | password_ = password; 15 | state_ = state; 16 | } 17 | 18 | void set_id(int id) 19 | { 20 | id_ = id; 21 | } 22 | 23 | void set_name(string name) 24 | { 25 | name_ = name; 26 | } 27 | 28 | void set_password(string password) 29 | { 30 | password_ = password; 31 | } 32 | 33 | void set_state(string state) 34 | { 35 | state_ = state; 36 | } 37 | 38 | int get_id() 39 | { 40 | return id_; 41 | } 42 | 43 | string get_name() 44 | { 45 | return name_; 46 | } 47 | 48 | string get_password() 49 | { 50 | return password_; 51 | } 52 | 53 | string get_state() 54 | { 55 | return state_; 56 | } 57 | 58 | private: 59 | int id_; 60 | string name_; 61 | string password_; 62 | string state_; 63 | }; 64 | #endif -------------------------------------------------------------------------------- /Service/build/src/client/cmake_install.cmake: -------------------------------------------------------------------------------- 1 | # Install script for directory: /home/ik/桌面/Service/src/client 2 | 3 | # Set the install prefix 4 | if(NOT DEFINED CMAKE_INSTALL_PREFIX) 5 | set(CMAKE_INSTALL_PREFIX "/usr/local") 6 | endif() 7 | string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") 8 | 9 | # Set the install configuration name. 10 | if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) 11 | if(BUILD_TYPE) 12 | string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" 13 | CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") 14 | else() 15 | set(CMAKE_INSTALL_CONFIG_NAME "Debug") 16 | endif() 17 | message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") 18 | endif() 19 | 20 | # Set the component getting installed. 21 | if(NOT CMAKE_INSTALL_COMPONENT) 22 | if(COMPONENT) 23 | message(STATUS "Install component: \"${COMPONENT}\"") 24 | set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") 25 | else() 26 | set(CMAKE_INSTALL_COMPONENT) 27 | endif() 28 | endif() 29 | 30 | # Install shared libraries without execute permission? 31 | if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) 32 | set(CMAKE_INSTALL_SO_NO_EXE "1") 33 | endif() 34 | 35 | # Is this installation the result of a crosscompile? 36 | if(NOT DEFINED CMAKE_CROSSCOMPILING) 37 | set(CMAKE_CROSSCOMPILING "FALSE") 38 | endif() 39 | 40 | -------------------------------------------------------------------------------- /Service/build/src/server/cmake_install.cmake: -------------------------------------------------------------------------------- 1 | # Install script for directory: /home/ik/桌面/Service/src/server 2 | 3 | # Set the install prefix 4 | if(NOT DEFINED CMAKE_INSTALL_PREFIX) 5 | set(CMAKE_INSTALL_PREFIX "/usr/local") 6 | endif() 7 | string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") 8 | 9 | # Set the install configuration name. 10 | if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) 11 | if(BUILD_TYPE) 12 | string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" 13 | CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") 14 | else() 15 | set(CMAKE_INSTALL_CONFIG_NAME "Debug") 16 | endif() 17 | message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") 18 | endif() 19 | 20 | # Set the component getting installed. 21 | if(NOT CMAKE_INSTALL_COMPONENT) 22 | if(COMPONENT) 23 | message(STATUS "Install component: \"${COMPONENT}\"") 24 | set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") 25 | else() 26 | set(CMAKE_INSTALL_COMPONENT) 27 | endif() 28 | endif() 29 | 30 | # Install shared libraries without execute permission? 31 | if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) 32 | set(CMAKE_INSTALL_SO_NO_EXE "1") 33 | endif() 34 | 35 | # Is this installation the result of a crosscompile? 36 | if(NOT DEFINED CMAKE_CROSSCOMPILING) 37 | set(CMAKE_CROSSCOMPILING "FALSE") 38 | endif() 39 | 40 | -------------------------------------------------------------------------------- /Service/src/server/model/FriendModel.cpp: -------------------------------------------------------------------------------- 1 | #include "FriendModel.hpp" 2 | #include "MySQL.hpp" 3 | 4 | //添加好友关系 5 | bool FriendModel::insert(int user_id, int friend_id) 6 | { 7 | //组装SQL语句 8 | char sql[1024] = {0}; 9 | sprintf(sql, "insert into Friend values(%d,%d);", user_id, friend_id); 10 | //cout << sql << endl; 11 | 12 | MySQL mysql; 13 | if (mysql.connet()) 14 | { 15 | if (mysql.update(sql)) 16 | { 17 | return true; 18 | } 19 | } 20 | return false; 21 | } 22 | 23 | //返回用户好友列表 24 | vector FriendModel::query(int user_id) 25 | { 26 | //组装SQL语句 27 | char sql[1024] = {0}; 28 | sprintf(sql, "select a.id,a.name,a.state from User a inner join Friend b on b.friendid = a.id where b.userid=%d;", user_id); 29 | //cout << sql << endl; 30 | 31 | vector vec; 32 | MySQL mysql; 33 | if (mysql.connet()) 34 | { 35 | MYSQL_RES *res = mysql.query(sql); 36 | if (res != nullptr) 37 | { 38 | MYSQL_ROW row; 39 | while ((row = mysql_fetch_row(res)) != nullptr) 40 | { 41 | User user; 42 | user.set_id(atoi(row[0])); 43 | user.set_name(row[1]); 44 | user.set_state(row[2]); 45 | vec.push_back(user); 46 | } 47 | //释放资源,否则内存不断泄露 48 | mysql_free_result(res); 49 | } 50 | } 51 | return vec; 52 | } -------------------------------------------------------------------------------- /Service/build/src/cmake_install.cmake: -------------------------------------------------------------------------------- 1 | # Install script for directory: /home/ik/桌面/Service/src 2 | 3 | # Set the install prefix 4 | if(NOT DEFINED CMAKE_INSTALL_PREFIX) 5 | set(CMAKE_INSTALL_PREFIX "/usr/local") 6 | endif() 7 | string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") 8 | 9 | # Set the install configuration name. 10 | if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) 11 | if(BUILD_TYPE) 12 | string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" 13 | CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") 14 | else() 15 | set(CMAKE_INSTALL_CONFIG_NAME "Debug") 16 | endif() 17 | message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") 18 | endif() 19 | 20 | # Set the component getting installed. 21 | if(NOT CMAKE_INSTALL_COMPONENT) 22 | if(COMPONENT) 23 | message(STATUS "Install component: \"${COMPONENT}\"") 24 | set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") 25 | else() 26 | set(CMAKE_INSTALL_COMPONENT) 27 | endif() 28 | endif() 29 | 30 | # Install shared libraries without execute permission? 31 | if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) 32 | set(CMAKE_INSTALL_SO_NO_EXE "1") 33 | endif() 34 | 35 | # Is this installation the result of a crosscompile? 36 | if(NOT DEFINED CMAKE_CROSSCOMPILING) 37 | set(CMAKE_CROSSCOMPILING "FALSE") 38 | endif() 39 | 40 | if(NOT CMAKE_INSTALL_LOCAL_ONLY) 41 | # Include the install script for each subdirectory. 42 | include("/home/ik/桌面/Service/build/src/server/cmake_install.cmake") 43 | include("/home/ik/桌面/Service/build/src/client/cmake_install.cmake") 44 | 45 | endif() 46 | 47 | -------------------------------------------------------------------------------- /Service/src/server/model/OfflineMessageModel.cpp: -------------------------------------------------------------------------------- 1 | #include "OfflineMessageModel.hpp" 2 | #include "MySQL.hpp" 3 | 4 | //存储用户的离线消息 5 | bool OfflineMessageModel::insert(int id, string msg) 6 | { 7 | //组装SQL语句 8 | char sql[1024] = {0}; 9 | sprintf(sql, "insert into OfflineMessage values(%d,'%s')", id, msg.c_str()); 10 | 11 | MySQL mysql; 12 | if (mysql.connet()) 13 | { 14 | if (mysql.update(sql)) 15 | { 16 | return true; 17 | } 18 | } 19 | return false; 20 | } 21 | 22 | //删除用户的离线消息 23 | bool OfflineMessageModel::remove(int id) 24 | { 25 | //组装SQL语句 26 | char sql[1024] = {0}; 27 | sprintf(sql, "delete from OfflineMessage where userid=%d", id); 28 | 29 | MySQL mysql; 30 | if (mysql.connet()) 31 | { 32 | if (mysql.update(sql)) 33 | { 34 | return true; 35 | } 36 | } 37 | return false; 38 | } 39 | 40 | //查询用户的聊天消息 41 | vector OfflineMessageModel::query(int id) 42 | { 43 | //组装SQL语句 44 | char sql[1024] = {0}; 45 | sprintf(sql, "select message from OfflineMessage where userid=%d", id); 46 | 47 | vector vec; 48 | MySQL mysql; 49 | if (mysql.connet()) 50 | { 51 | MYSQL_RES *res = mysql.query(sql); 52 | if (res != nullptr) 53 | { 54 | MYSQL_ROW row; 55 | while ((row = mysql_fetch_row(res)) != nullptr) 56 | { 57 | vec.push_back(row[0]); 58 | } 59 | //释放资源,否则内存不断泄露 60 | mysql_free_result(res); 61 | } 62 | } 63 | return vec; 64 | } 65 | 66 | -------------------------------------------------------------------------------- /Service/src/server/ChatServer.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "ChatServer.hpp" 5 | #include "ChatService.hpp" 6 | #include "json.hpp" 7 | 8 | using namespace std; 9 | using namespace placeholders; 10 | using json = nlohmann::json; 11 | 12 | //初始化聊天服务器对象 13 | ChatServer::ChatServer(EventLoop *loop, const InetAddress &listenAddr, const string &nameArg) 14 | : server_(loop, listenAddr, nameArg), 15 | loop_(loop) 16 | { 17 | //注册连接回调 18 | server_.setConnectionCallback(bind(&ChatServer::on_connection, this, _1)); 19 | 20 | //注册消息回调 21 | server_.setMessageCallback(bind(&ChatServer::on_message, this, _1, _2, _3)); 22 | 23 | //设置线程数量 24 | server_.setThreadNum(4); 25 | } 26 | 27 | //启动服务 28 | void ChatServer::start() 29 | { 30 | server_.start(); 31 | } 32 | 33 | //上报连接相关信息的回调函数 34 | void ChatServer::on_connection(const TcpConnectionPtr &conn) 35 | { 36 | //如果用户断开连接 37 | if (!conn->connected()) 38 | { 39 | //处理异常断开 40 | ChatService::instance()->client_close_exception(conn); 41 | conn->shutdown(); 42 | } 43 | } 44 | 45 | //上报读写时间相关信息的回调函数 46 | void ChatServer::on_message(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time) 47 | { 48 | string buf = buffer->retrieveAllAsString(); 49 | cout<<"exute: "<get_handler(js["msgid"].get()); 55 | 56 | //其实这个msg_handler就是login或者regist 57 | msg_handler(conn, js, time); 58 | } 59 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/DependInfo.cmake: -------------------------------------------------------------------------------- 1 | # The set of languages for which implicit dependencies are needed: 2 | set(CMAKE_DEPENDS_LANGUAGES 3 | "CXX" 4 | ) 5 | # The set of files for implicit dependencies of each language: 6 | set(CMAKE_DEPENDS_CHECK_CXX 7 | "/home/ik/桌面/Service/src/server/ChatServer.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o" 8 | "/home/ik/桌面/Service/src/server/ChatService.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o" 9 | "/home/ik/桌面/Service/src/server/main.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/main.cpp.o" 10 | "/home/ik/桌面/Service/src/server/model/FriendModel.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o" 11 | "/home/ik/桌面/Service/src/server/model/GroupModel.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o" 12 | "/home/ik/桌面/Service/src/server/model/OfflineMessageModel.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o" 13 | "/home/ik/桌面/Service/src/server/model/UserModel.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o" 14 | "/home/ik/桌面/Service/src/server/redis/Redis.cpp" "/home/ik/桌面/Service/build/src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o" 15 | ) 16 | set(CMAKE_CXX_COMPILER_ID "GNU") 17 | 18 | # The include file search paths: 19 | set(CMAKE_CXX_TARGET_INCLUDE_PATH 20 | "../include" 21 | "../include/server" 22 | "../include/server/db" 23 | "../include/server/model" 24 | "../include/server/redis" 25 | "../thirdparty" 26 | ) 27 | 28 | # Targets to which this target links. 29 | set(CMAKE_TARGET_LINKED_INFO_FILES 30 | ) 31 | 32 | # Fortran module output directory. 33 | set(CMAKE_Fortran_TARGET_MODULE_DIR "") 34 | -------------------------------------------------------------------------------- /Service/include/server/db/MySQL.hpp: -------------------------------------------------------------------------------- 1 | #ifndef MYSQL_H 2 | #define MYSQL_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | #define SERVER "127.0.0.1" 11 | #define USER "ik" 12 | #define PASSWORD "123456" 13 | #define DBNAME "chat" 14 | 15 | class MySQL 16 | { 17 | public: 18 | //初始化数据库连接 19 | MySQL() 20 | { 21 | conn_ = mysql_init(nullptr); 22 | } 23 | 24 | //释放连接 25 | ~MySQL() 26 | { 27 | if (conn_ != nullptr) 28 | { 29 | mysql_close(conn_); 30 | } 31 | } 32 | 33 | //连接数据库 34 | bool connet() 35 | { 36 | MYSQL *p = mysql_real_connect(conn_, SERVER, USER, PASSWORD, DBNAME, 3306, nullptr, 0); 37 | if (p != nullptr) 38 | { 39 | //代码支持中文,因为默认是ASCII 40 | mysql_query(conn_, "set names gbk"); 41 | LOG_INFO << "connect mysql success!"; 42 | } 43 | else 44 | { 45 | LOG_INFO << "connect mysql fail!"; 46 | } 47 | 48 | return p; 49 | } 50 | 51 | //更新操作 52 | bool update(string sql) 53 | { 54 | if (mysql_query(conn_, sql.c_str())) 55 | { 56 | LOG_INFO << __FILE__ << " : " << __LINE__ << " : " << sql << " update error!"; 57 | return false; 58 | } 59 | return true; 60 | } 61 | 62 | //查询操作 63 | MYSQL_RES *query(string sql) 64 | { 65 | if (mysql_query(conn_, sql.c_str())) 66 | { 67 | LOG_INFO << __FILE__ << " : " << __LINE__ << " : " << sql << " select error!"; 68 | return nullptr; 69 | } 70 | return mysql_use_result(conn_); 71 | } 72 | 73 | //获取连接 74 | MYSQL *get_connection() 75 | { 76 | return conn_; 77 | } 78 | 79 | private: 80 | MYSQL *conn_; 81 | }; 82 | #endif 83 | -------------------------------------------------------------------------------- /Service/build/cmake_install.cmake: -------------------------------------------------------------------------------- 1 | # Install script for directory: /home/ik/桌面/Service 2 | 3 | # Set the install prefix 4 | if(NOT DEFINED CMAKE_INSTALL_PREFIX) 5 | set(CMAKE_INSTALL_PREFIX "/usr/local") 6 | endif() 7 | string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") 8 | 9 | # Set the install configuration name. 10 | if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) 11 | if(BUILD_TYPE) 12 | string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" 13 | CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") 14 | else() 15 | set(CMAKE_INSTALL_CONFIG_NAME "Debug") 16 | endif() 17 | message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") 18 | endif() 19 | 20 | # Set the component getting installed. 21 | if(NOT CMAKE_INSTALL_COMPONENT) 22 | if(COMPONENT) 23 | message(STATUS "Install component: \"${COMPONENT}\"") 24 | set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") 25 | else() 26 | set(CMAKE_INSTALL_COMPONENT) 27 | endif() 28 | endif() 29 | 30 | # Install shared libraries without execute permission? 31 | if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) 32 | set(CMAKE_INSTALL_SO_NO_EXE "1") 33 | endif() 34 | 35 | # Is this installation the result of a crosscompile? 36 | if(NOT DEFINED CMAKE_CROSSCOMPILING) 37 | set(CMAKE_CROSSCOMPILING "FALSE") 38 | endif() 39 | 40 | if(NOT CMAKE_INSTALL_LOCAL_ONLY) 41 | # Include the install script for each subdirectory. 42 | include("/home/ik/桌面/Service/build/src/cmake_install.cmake") 43 | 44 | endif() 45 | 46 | if(CMAKE_INSTALL_COMPONENT) 47 | set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") 48 | else() 49 | set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") 50 | endif() 51 | 52 | string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT 53 | "${CMAKE_INSTALL_MANIFEST_FILES}") 54 | file(WRITE "/home/ik/桌面/Service/build/${CMAKE_INSTALL_MANIFEST}" 55 | "${CMAKE_INSTALL_MANIFEST_CONTENT}") 56 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/Makefile.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # The generator used is: 5 | set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") 6 | 7 | # The top level Makefile was generated from the following files: 8 | set(CMAKE_MAKEFILE_DEPENDS 9 | "CMakeCache.txt" 10 | "../CMakeLists.txt" 11 | "CMakeFiles/3.10.2/CMakeCCompiler.cmake" 12 | "CMakeFiles/3.10.2/CMakeCXXCompiler.cmake" 13 | "CMakeFiles/3.10.2/CMakeSystem.cmake" 14 | "../src/CMakeLists.txt" 15 | "../src/client/CMakeLists.txt" 16 | "../src/server/CMakeLists.txt" 17 | "/usr/share/cmake-3.10/Modules/CMakeCInformation.cmake" 18 | "/usr/share/cmake-3.10/Modules/CMakeCXXInformation.cmake" 19 | "/usr/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake" 20 | "/usr/share/cmake-3.10/Modules/CMakeGenericSystem.cmake" 21 | "/usr/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake" 22 | "/usr/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake" 23 | "/usr/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake" 24 | "/usr/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake" 25 | "/usr/share/cmake-3.10/Modules/Compiler/GNU-C.cmake" 26 | "/usr/share/cmake-3.10/Modules/Compiler/GNU-CXX.cmake" 27 | "/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake" 28 | "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU-C.cmake" 29 | "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU-CXX.cmake" 30 | "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU.cmake" 31 | "/usr/share/cmake-3.10/Modules/Platform/Linux.cmake" 32 | "/usr/share/cmake-3.10/Modules/Platform/UnixPaths.cmake" 33 | ) 34 | 35 | # The corresponding makefile is: 36 | set(CMAKE_MAKEFILE_OUTPUTS 37 | "Makefile" 38 | "CMakeFiles/cmake.check_cache" 39 | ) 40 | 41 | # Byproducts of CMake generate step: 42 | set(CMAKE_MAKEFILE_PRODUCTS 43 | "CMakeFiles/CMakeDirectoryInformation.cmake" 44 | "src/CMakeFiles/CMakeDirectoryInformation.cmake" 45 | "src/server/CMakeFiles/CMakeDirectoryInformation.cmake" 46 | "src/client/CMakeFiles/CMakeDirectoryInformation.cmake" 47 | ) 48 | 49 | # Dependency information for all targets: 50 | set(CMAKE_DEPEND_INFO_FILES 51 | "src/server/CMakeFiles/ChatServer.dir/DependInfo.cmake" 52 | "src/client/CMakeFiles/ChatClient.dir/DependInfo.cmake" 53 | ) 54 | -------------------------------------------------------------------------------- /Service/include/server/ChatService.hpp: -------------------------------------------------------------------------------- 1 | #ifndef CHATSERVICE_H 2 | #define CHATSERVICE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "json.hpp" 9 | #include "UserModel.hpp" 10 | #include "OfflineMessageModel.hpp" 11 | #include "FriendModel.hpp" 12 | #include "GroupModel.hpp" 13 | #include "Redis.hpp" 14 | 15 | using namespace std; 16 | using namespace muduo; 17 | using namespace muduo::net; 18 | using namespace placeholders; 19 | 20 | using json = nlohmann::json; 21 | using MsgHandler = function; 22 | 23 | //聊天服务器业务类,单例模式设计,因为一个就够了。 24 | //映射事件回调用 25 | 26 | class ChatService 27 | { 28 | public: 29 | //获取单例对象 30 | static ChatService *instance(); 31 | 32 | //登录 33 | void login(const TcpConnectionPtr &conn, json &js, Timestamp time); 34 | 35 | //注册 36 | void regist(const TcpConnectionPtr &conn, json &js, Timestamp time); 37 | 38 | //一对一聊天业务 39 | void one_chat(const TcpConnectionPtr &conn, json &js, Timestamp time); 40 | 41 | //添加好友业务 42 | bool add_friend(const TcpConnectionPtr &conn, json &js, Timestamp time); 43 | 44 | //创建 群组 45 | bool create_group(const TcpConnectionPtr &conn, json &js, Timestamp time); 46 | 47 | //加入群组 48 | bool add_group(const TcpConnectionPtr &conn, json &js, Timestamp time); 49 | 50 | //群聊业务 51 | void group_chat(const TcpConnectionPtr &conn, json &js, Timestamp time); 52 | 53 | //注销业务 54 | void loginout(const TcpConnectionPtr &conn, json &js, Timestamp time); 55 | 56 | //redis订阅消息触发的回调函数 57 | void redis_subscribe_message_handler(int channel, string message); 58 | 59 | //获取消息对应的处理器 60 | MsgHandler get_handler(int msgid); 61 | 62 | //处理客户端异常退出 63 | void client_close_exception(const TcpConnectionPtr &conn); 64 | 65 | //服务器异常,业务重置 66 | void reset(); 67 | 68 | private: 69 | //注册消息以及对应的回调操作 70 | ChatService(); 71 | 72 | private: 73 | //存储事件触发的回调函数 74 | unordered_map msg_handler_map_; 75 | 76 | //存储在线用户的连接情况,便于服务器给用户发消息,注意线程安全 77 | unordered_map user_connection_map_; 78 | mutex conn_mutex_; 79 | 80 | //redis操作对象 81 | Redis redis_; 82 | 83 | UserModel user_model_; 84 | OfflineMessageModel offline_message_model_; 85 | FriendModel friend_model_; 86 | GroupModel group_model_; 87 | }; 88 | 89 | #endif -------------------------------------------------------------------------------- /Service/src/server/model/UserModel.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "UserModel.hpp" 3 | #include "MySQL.hpp" 4 | 5 | using namespace std; 6 | 7 | //增加User 8 | bool UserModel::insert(User &user) 9 | { 10 | //组装SQL语句 11 | char sql[1024] = {0}; 12 | sprintf(sql, "insert into User(name,password,state) values('%s','%s','%s')", 13 | user.get_name().c_str(), user.get_password().c_str(), user.get_state().c_str()); 14 | 15 | MySQL mysql; 16 | if (mysql.connet()) 17 | { 18 | if (mysql.update(sql)) 19 | { 20 | //获取自增的用户ID 21 | user.set_id(mysql_insert_id(mysql.get_connection())); 22 | return true; 23 | } 24 | } 25 | return false; 26 | } 27 | 28 | //根据ID查询user信息,失败返回一个默认构造User,id = -1 29 | User UserModel::query(int id) 30 | { 31 | //组装SQL语句 32 | char sql[1024] = {0}; 33 | sprintf(sql, "select * from User where id=%d", id); 34 | 35 | MySQL mysql; 36 | if (mysql.connet()) 37 | { 38 | MYSQL_RES *res = mysql.query(sql); 39 | if (res != nullptr) 40 | { 41 | MYSQL_ROW row = mysql_fetch_row(res); 42 | if (row != nullptr) 43 | { 44 | User user; 45 | user.set_id(atoi(row[0])); 46 | user.set_name(row[1]); 47 | user.set_password(row[2]); 48 | user.set_state(row[3]); 49 | 50 | //释放资源,否则内存不断泄露 51 | mysql_free_result(res); 52 | 53 | return user; 54 | } 55 | } 56 | } 57 | return User(); 58 | } 59 | 60 | //更新状态操作 61 | bool UserModel::update_state(User user) 62 | { 63 | //组装SQL语句 64 | char sql[1024] = {0}; 65 | sprintf(sql, "update User set state='%s' where id=%d;", user.get_state().c_str(), user.get_id()); 66 | //cout << sql << endl; 67 | 68 | MySQL mysql; 69 | if (mysql.connet()) 70 | { 71 | if (mysql.update(sql)) 72 | { 73 | return true; 74 | } 75 | } 76 | return false; 77 | } 78 | 79 | //重置用户状态信息 80 | bool UserModel::reset_state() 81 | { 82 | //组装SQL语句 83 | char sql[1024] = {0}; 84 | sprintf(sql, "update User set state='offline' where state='online';"); 85 | //cout << sql << endl; 86 | 87 | MySQL mysql; 88 | if (mysql.connet()) 89 | { 90 | if (mysql.update(sql)) 91 | { 92 | return true; 93 | } 94 | } 95 | return false; 96 | } 97 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CMakeCCompiler.cmake: -------------------------------------------------------------------------------- 1 | set(CMAKE_C_COMPILER "/usr/bin/gcc-7") 2 | set(CMAKE_C_COMPILER_ARG1 "") 3 | set(CMAKE_C_COMPILER_ID "GNU") 4 | set(CMAKE_C_COMPILER_VERSION "7.5.0") 5 | set(CMAKE_C_COMPILER_VERSION_INTERNAL "") 6 | set(CMAKE_C_COMPILER_WRAPPER "") 7 | set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") 8 | set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") 9 | set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") 10 | set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") 11 | set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") 12 | 13 | set(CMAKE_C_PLATFORM_ID "Linux") 14 | set(CMAKE_C_SIMULATE_ID "") 15 | set(CMAKE_C_SIMULATE_VERSION "") 16 | 17 | 18 | 19 | set(CMAKE_AR "/usr/bin/ar") 20 | set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-7") 21 | set(CMAKE_RANLIB "/usr/bin/ranlib") 22 | set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") 23 | set(CMAKE_LINKER "/usr/bin/ld") 24 | set(CMAKE_COMPILER_IS_GNUCC 1) 25 | set(CMAKE_C_COMPILER_LOADED 1) 26 | set(CMAKE_C_COMPILER_WORKS TRUE) 27 | set(CMAKE_C_ABI_COMPILED TRUE) 28 | set(CMAKE_COMPILER_IS_MINGW ) 29 | set(CMAKE_COMPILER_IS_CYGWIN ) 30 | if(CMAKE_COMPILER_IS_CYGWIN) 31 | set(CYGWIN 1) 32 | set(UNIX 1) 33 | endif() 34 | 35 | set(CMAKE_C_COMPILER_ENV_VAR "CC") 36 | 37 | if(CMAKE_COMPILER_IS_MINGW) 38 | set(MINGW 1) 39 | endif() 40 | set(CMAKE_C_COMPILER_ID_RUN 1) 41 | set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) 42 | set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) 43 | set(CMAKE_C_LINKER_PREFERENCE 10) 44 | 45 | # Save compiler ABI information. 46 | set(CMAKE_C_SIZEOF_DATA_PTR "8") 47 | set(CMAKE_C_COMPILER_ABI "ELF") 48 | set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") 49 | 50 | if(CMAKE_C_SIZEOF_DATA_PTR) 51 | set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") 52 | endif() 53 | 54 | if(CMAKE_C_COMPILER_ABI) 55 | set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") 56 | endif() 57 | 58 | if(CMAKE_C_LIBRARY_ARCHITECTURE) 59 | set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") 60 | endif() 61 | 62 | set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") 63 | if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) 64 | set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") 65 | endif() 66 | 67 | 68 | 69 | 70 | 71 | set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") 72 | set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") 73 | set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") 74 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/depend.internal: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o 5 | ../include/server/ChatServer.hpp 6 | ../include/server/ChatService.hpp 7 | ../include/server/model/FriendModel.hpp 8 | ../include/server/model/Group.hpp 9 | ../include/server/model/GroupModel.hpp 10 | ../include/server/model/GroupUser.hpp 11 | ../include/server/model/OfflineMessageModel.hpp 12 | ../include/server/model/User.hpp 13 | ../include/server/model/UserModel.hpp 14 | ../include/server/redis/Redis.hpp 15 | ../thirdparty/json.hpp 16 | /home/ik/桌面/Service/src/server/ChatServer.cpp 17 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o 18 | ../include/public.hpp 19 | ../include/server/ChatService.hpp 20 | ../include/server/model/FriendModel.hpp 21 | ../include/server/model/Group.hpp 22 | ../include/server/model/GroupModel.hpp 23 | ../include/server/model/GroupUser.hpp 24 | ../include/server/model/OfflineMessageModel.hpp 25 | ../include/server/model/User.hpp 26 | ../include/server/model/UserModel.hpp 27 | ../include/server/redis/Redis.hpp 28 | ../thirdparty/json.hpp 29 | /home/ik/桌面/Service/src/server/ChatService.cpp 30 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o 31 | ../include/server/ChatServer.hpp 32 | ../include/server/ChatService.hpp 33 | ../include/server/model/FriendModel.hpp 34 | ../include/server/model/Group.hpp 35 | ../include/server/model/GroupModel.hpp 36 | ../include/server/model/GroupUser.hpp 37 | ../include/server/model/OfflineMessageModel.hpp 38 | ../include/server/model/User.hpp 39 | ../include/server/model/UserModel.hpp 40 | ../include/server/redis/Redis.hpp 41 | ../thirdparty/json.hpp 42 | /home/ik/桌面/Service/src/server/main.cpp 43 | src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o 44 | ../include/server/db/MySQL.hpp 45 | ../include/server/model/FriendModel.hpp 46 | ../include/server/model/User.hpp 47 | /home/ik/桌面/Service/src/server/model/FriendModel.cpp 48 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o 49 | ../include/server/db/MySQL.hpp 50 | ../include/server/model/Group.hpp 51 | ../include/server/model/GroupModel.hpp 52 | ../include/server/model/GroupUser.hpp 53 | ../include/server/model/User.hpp 54 | /home/ik/桌面/Service/src/server/model/GroupModel.cpp 55 | src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o 56 | ../include/server/db/MySQL.hpp 57 | ../include/server/model/OfflineMessageModel.hpp 58 | /home/ik/桌面/Service/src/server/model/OfflineMessageModel.cpp 59 | src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o 60 | ../include/server/db/MySQL.hpp 61 | ../include/server/model/User.hpp 62 | ../include/server/model/UserModel.hpp 63 | /home/ik/桌面/Service/src/server/model/UserModel.cpp 64 | src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o 65 | ../include/server/redis/Redis.hpp 66 | /home/ik/桌面/Service/src/server/redis/Redis.cpp 67 | -------------------------------------------------------------------------------- /Service/src/server/redis/Redis.cpp: -------------------------------------------------------------------------------- 1 | #include "Redis.hpp" 2 | #include 3 | 4 | Redis::Redis() : publish_context_(nullptr), subcribe_context_(nullptr) 5 | { 6 | } 7 | 8 | Redis::~Redis() 9 | { 10 | if (publish_context_ != nullptr) 11 | { 12 | redisFree(publish_context_); 13 | } 14 | 15 | if (subcribe_context_ != nullptr) 16 | { 17 | redisFree(subcribe_context_); 18 | } 19 | } 20 | 21 | //连接Redis服务器 22 | bool Redis::connect() 23 | { 24 | publish_context_ = redisConnect("127.0.0.1", 6379); 25 | if (publish_context_ == nullptr) 26 | { 27 | cerr << "connect redis failed!" << endl; 28 | return false; 29 | } 30 | 31 | subcribe_context_ = redisConnect("127.0.0.1", 6379); 32 | if (subcribe_context_ == nullptr) 33 | { 34 | cerr << "connect redis failed!" << endl; 35 | return false; 36 | } 37 | 38 | thread t([&]() { 39 | observer_channel_message(); 40 | }); 41 | t.detach(); 42 | 43 | cout << "connect redis-server success!" << endl; 44 | return true; 45 | } 46 | 47 | //向Redis指定的通道channel发布消息 48 | bool Redis::publish(int channel, string message) 49 | { 50 | //相当于publish 键 值 51 | redisReply *reply = (redisReply *)redisCommand(publish_context_, "PUBLISH %d %s", channel, message.c_str()); 52 | if (reply == nullptr) 53 | { 54 | cerr << "publish command failed!" << endl; 55 | return false; 56 | } 57 | 58 | freeReplyObject(reply); 59 | return true; 60 | } 61 | 62 | //向Redis指定的通道subscribe订阅消息 63 | bool Redis::subscribe(int channel) 64 | { 65 | //redisCommand 会先把命令缓存到context中,然后调用RedisAppendCommand发送给redis 66 | //redis执行subscribe是阻塞,不会响应,不会给我们一个reply 67 | if (REDIS_ERR == redisAppendCommand(subcribe_context_, "SUBSCRIBE %d", channel)) 68 | { 69 | cerr << "subscibe command failed" << endl; 70 | return false; 71 | } 72 | 73 | int done = 0; 74 | while (!done) 75 | { 76 | if (REDIS_ERR == redisBufferWrite(subcribe_context_, &done)) 77 | { 78 | cerr << "subscribe command failed" << endl; 79 | return false; 80 | } 81 | } 82 | 83 | return true; 84 | } 85 | 86 | //取消订阅 87 | bool Redis::unsubscribe(int channel) 88 | { 89 | //redisCommand 会先把命令缓存到context中,然后调用RedisAppendCommand发送给redis 90 | //redis执行subscribe是阻塞,不会响应,不会给我们一个reply 91 | if (REDIS_ERR == redisAppendCommand(subcribe_context_, "UNSUBSCRIBE %d", channel)) 92 | { 93 | cerr << "subscibe command failed" << endl; 94 | return false; 95 | } 96 | 97 | int done = 0; 98 | while (!done) 99 | { 100 | if (REDIS_ERR == redisBufferWrite(subcribe_context_, &done)) 101 | { 102 | cerr << "subscribe command failed" << endl; 103 | return false; 104 | } 105 | } 106 | 107 | return true; 108 | } 109 | 110 | //独立线程中接收订阅通道的消息 111 | void Redis::observer_channel_message() 112 | { 113 | redisReply *reply = nullptr; 114 | while (REDIS_OK == redisGetReply(subcribe_context_, (void **)&reply)) 115 | { 116 | //reply里面是返回的数据有三个,0. message , 1.通道号,2.消息 117 | if (reply != nullptr && reply->element[2] != nullptr && reply->element[2]->str != nullptr) 118 | { 119 | //给业务层上报消息 120 | notify_message_handler_(atoi(reply->element[1]->str), reply->element[2]->str); 121 | } 122 | 123 | freeReplyObject(reply); 124 | } 125 | 126 | cerr << "----------------------- oberver_channel_message quit--------------------------" << endl; 127 | } 128 | 129 | //初始化业务层上报通道消息的回调对象 130 | void Redis::init_notify_handler(redis_handler handler) 131 | { 132 | notify_message_handler_ = handler; 133 | } 134 | -------------------------------------------------------------------------------- /Service/src/server/model/GroupModel.cpp: -------------------------------------------------------------------------------- 1 | #include "GroupModel.hpp" 2 | #include "MySQL.hpp" 3 | #include 4 | using namespace std; 5 | 6 | //创建群组 7 | bool GroupModel::create_group(Group &group) 8 | { 9 | //组装SQL语句 10 | char sql[1024] = {0}; 11 | sprintf(sql, "insert into AllGroup(groupname,groupdesc) values('%s','%s');", group.get_name().c_str(), group.get_desc().c_str()); 12 | //cout << sql << endl; 13 | 14 | MySQL mysql; 15 | if (mysql.connet()) 16 | { 17 | if (mysql.update(sql)) 18 | { 19 | group.set_id(mysql_insert_id(mysql.get_connection())); 20 | return true; 21 | } 22 | } 23 | return false; 24 | } 25 | 26 | //加入群组 27 | bool GroupModel::add_group(int user_id, int group_id, string role) 28 | { 29 | //组装SQL语句 30 | char sql[1024] = {0}; 31 | sprintf(sql, "insert into GroupUser values(%d,%d,'%s');", group_id, user_id, role.c_str()); 32 | cout << sql << endl; 33 | 34 | MySQL mysql; 35 | if (mysql.connet()) 36 | { 37 | if (mysql.update(sql)) 38 | { 39 | return true; 40 | } 41 | } 42 | return false; 43 | } 44 | 45 | //查询用户所在群组信息 46 | vector GroupModel::query_group(int user_id) 47 | { 48 | //组装SQL语句 49 | char sql[1024] = {0}; 50 | sprintf(sql, "select a.id,a.groupname,a.groupdesc from AllGroup a inner join GroupUser b on b.groupid=a.id where b.userid=%d;", user_id); 51 | //cout << sql << endl; 52 | 53 | vector group_vec; 54 | MySQL mysql; 55 | if (mysql.connet()) 56 | { 57 | MYSQL_RES *res = mysql.query(sql); 58 | if (res != nullptr) 59 | { 60 | MYSQL_ROW row; 61 | while ((row = mysql_fetch_row(res)) != nullptr) 62 | { 63 | Group group; 64 | group.set_id(atoi(row[0])); 65 | group.set_name(row[1]); 66 | group.set_desc(row[2]); 67 | group_vec.push_back(group); 68 | } 69 | //释放资源,否则内存不断泄露 70 | mysql_free_result(res); 71 | } 72 | } 73 | 74 | //查询群组所有群员的信息 75 | for (Group &temp : group_vec) 76 | { 77 | sprintf(sql, "select a.id,a.name,a.state,b.grouprole from User a inner join GroupUser b on b.userid=a.id where b.groupid=%d;", temp.get_id()); 78 | 79 | MYSQL_RES *res = mysql.query(sql); 80 | if (res != nullptr) 81 | { 82 | MYSQL_ROW row; 83 | while ((row = mysql_fetch_row(res)) != nullptr) 84 | { 85 | GroupUser group_user; 86 | group_user.set_id(atoi(row[0])); 87 | group_user.set_name(row[1]); 88 | group_user.set_state(row[2]); 89 | group_user.set_role(row[3]); 90 | temp.get_User().push_back(group_user); 91 | } 92 | //释放资源,否则内存不断泄露 93 | mysql_free_result(res); 94 | } 95 | return group_vec; 96 | } 97 | } 98 | 99 | //根据指定的groupid查询群组用户id列表,除userid自己,给该群用户群发消息 100 | vector GroupModel::query_group_users(int user_id, int group_id) 101 | { 102 | //组装SQL语句 103 | char sql[1024] = {0}; 104 | sprintf(sql, "select userid from GroupUser where groupid=%d and userid != %d;", group_id, user_id); 105 | //cout << sql << endl; 106 | 107 | vector id_vec; 108 | MySQL mysql; 109 | if (mysql.connet()) 110 | { 111 | MYSQL_RES *res = mysql.query(sql); 112 | if (res != nullptr) 113 | { 114 | MYSQL_ROW row; 115 | while ((row = mysql_fetch_row(res)) != nullptr) 116 | { 117 | id_vec.push_back(atoi(row[0])); 118 | } 119 | //释放资源,否则内存不断泄露 120 | mysql_free_result(res); 121 | } 122 | } 123 | return id_vec; 124 | } 125 | -------------------------------------------------------------------------------- /Service/build/compile_commands.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "directory": "/home/ik/桌面/Service/build/src/server", 4 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/ChatServer.cpp.o -c /home/ik/桌面/Service/src/server/ChatServer.cpp", 5 | "file": "/home/ik/桌面/Service/src/server/ChatServer.cpp" 6 | }, 7 | { 8 | "directory": "/home/ik/桌面/Service/build/src/server", 9 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/ChatService.cpp.o -c /home/ik/桌面/Service/src/server/ChatService.cpp", 10 | "file": "/home/ik/桌面/Service/src/server/ChatService.cpp" 11 | }, 12 | { 13 | "directory": "/home/ik/桌面/Service/build/src/server", 14 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/main.cpp.o -c /home/ik/桌面/Service/src/server/main.cpp", 15 | "file": "/home/ik/桌面/Service/src/server/main.cpp" 16 | }, 17 | { 18 | "directory": "/home/ik/桌面/Service/build/src/server", 19 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o -c /home/ik/桌面/Service/src/server/model/FriendModel.cpp", 20 | "file": "/home/ik/桌面/Service/src/server/model/FriendModel.cpp" 21 | }, 22 | { 23 | "directory": "/home/ik/桌面/Service/build/src/server", 24 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o -c /home/ik/桌面/Service/src/server/model/GroupModel.cpp", 25 | "file": "/home/ik/桌面/Service/src/server/model/GroupModel.cpp" 26 | }, 27 | { 28 | "directory": "/home/ik/桌面/Service/build/src/server", 29 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o -c /home/ik/桌面/Service/src/server/model/OfflineMessageModel.cpp", 30 | "file": "/home/ik/桌面/Service/src/server/model/OfflineMessageModel.cpp" 31 | }, 32 | { 33 | "directory": "/home/ik/桌面/Service/build/src/server", 34 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/model/UserModel.cpp.o -c /home/ik/桌面/Service/src/server/model/UserModel.cpp", 35 | "file": "/home/ik/桌面/Service/src/server/model/UserModel.cpp" 36 | }, 37 | { 38 | "directory": "/home/ik/桌面/Service/build/src/server", 39 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatServer.dir/redis/Redis.cpp.o -c /home/ik/桌面/Service/src/server/redis/Redis.cpp", 40 | "file": "/home/ik/桌面/Service/src/server/redis/Redis.cpp" 41 | }, 42 | { 43 | "directory": "/home/ik/桌面/Service/build/src/client", 44 | "command": "/usr/bin/g++-7 -I/home/ik/桌面/Service/include -I/home/ik/桌面/Service/include/server -I/home/ik/桌面/Service/include/server/db -I/home/ik/桌面/Service/include/server/model -I/home/ik/桌面/Service/include/server/redis -I/home/ik/桌面/Service/thirdparty -g -g -o CMakeFiles/ChatClient.dir/main.cpp.o -c /home/ik/桌面/Service/src/client/main.cpp", 45 | "file": "/home/ik/桌面/Service/src/client/main.cpp" 46 | } 47 | ] -------------------------------------------------------------------------------- /Service/build/src/Makefile: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Default target executed when no arguments are given to make. 5 | default_target: all 6 | 7 | .PHONY : default_target 8 | 9 | # Allow only one "make -f Makefile2" at a time, but pass parallelism. 10 | .NOTPARALLEL: 11 | 12 | 13 | #============================================================================= 14 | # Special targets provided by cmake. 15 | 16 | # Disable implicit rules so canonical targets will work. 17 | .SUFFIXES: 18 | 19 | 20 | # Remove some rules from gmake that .SUFFIXES does not remove. 21 | SUFFIXES = 22 | 23 | .SUFFIXES: .hpux_make_needs_suffix_list 24 | 25 | 26 | # Suppress display of executed commands. 27 | $(VERBOSE).SILENT: 28 | 29 | 30 | # A target that is always out of date. 31 | cmake_force: 32 | 33 | .PHONY : cmake_force 34 | 35 | #============================================================================= 36 | # Set environment variables for the build. 37 | 38 | # The shell in which to execute make rules. 39 | SHELL = /bin/sh 40 | 41 | # The CMake executable. 42 | CMAKE_COMMAND = /usr/bin/cmake 43 | 44 | # The command to remove a file. 45 | RM = /usr/bin/cmake -E remove -f 46 | 47 | # Escaping for special characters. 48 | EQUALS = = 49 | 50 | # The top-level source directory on which CMake was run. 51 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 52 | 53 | # The top-level build directory on which CMake was run. 54 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 55 | 56 | #============================================================================= 57 | # Targets provided globally by CMake. 58 | 59 | # Special rule for the target rebuild_cache 60 | rebuild_cache: 61 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." 62 | /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) 63 | .PHONY : rebuild_cache 64 | 65 | # Special rule for the target rebuild_cache 66 | rebuild_cache/fast: rebuild_cache 67 | 68 | .PHONY : rebuild_cache/fast 69 | 70 | # Special rule for the target edit_cache 71 | edit_cache: 72 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." 73 | /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. 74 | .PHONY : edit_cache 75 | 76 | # Special rule for the target edit_cache 77 | edit_cache/fast: edit_cache 78 | 79 | .PHONY : edit_cache/fast 80 | 81 | # The main all target 82 | all: cmake_check_build_system 83 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles /home/ik/桌面/Service/build/src/CMakeFiles/progress.marks 84 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/all 85 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 86 | .PHONY : all 87 | 88 | # The main clean target 89 | clean: 90 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/clean 91 | .PHONY : clean 92 | 93 | # The main clean target 94 | clean/fast: clean 95 | 96 | .PHONY : clean/fast 97 | 98 | # Prepare targets for installation. 99 | preinstall: all 100 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall 101 | .PHONY : preinstall 102 | 103 | # Prepare targets for installation. 104 | preinstall/fast: 105 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall 106 | .PHONY : preinstall/fast 107 | 108 | # clear depends 109 | depend: 110 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 111 | .PHONY : depend 112 | 113 | # Help Target 114 | help: 115 | @echo "The following are some of the valid targets for this Makefile:" 116 | @echo "... all (the default if no target is provided)" 117 | @echo "... clean" 118 | @echo "... depend" 119 | @echo "... rebuild_cache" 120 | @echo "... edit_cache" 121 | .PHONY : help 122 | 123 | 124 | 125 | #============================================================================= 126 | # Special targets to cleanup operation of make. 127 | 128 | # Special rule to run CMake to check the build system integrity. 129 | # No rule that depends on this can have commands that come from listfiles 130 | # because they might be regenerated. 131 | cmake_check_build_system: 132 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 133 | .PHONY : cmake_check_build_system 134 | 135 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/CXX.includecache: -------------------------------------------------------------------------------- 1 | #IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) 2 | 3 | #IncludeRegexScan: ^.*$ 4 | 5 | #IncludeRegexComplain: ^$ 6 | 7 | #IncludeRegexTransform: 8 | 9 | ../include/public.hpp 10 | 11 | ../include/server/model/Group.hpp 12 | GroupUser.hpp 13 | ../include/server/model/GroupUser.hpp 14 | string 15 | - 16 | vector 17 | - 18 | 19 | ../include/server/model/GroupUser.hpp 20 | User.hpp 21 | ../include/server/model/User.hpp 22 | 23 | ../include/server/model/User.hpp 24 | string 25 | - 26 | 27 | ../thirdparty/json.hpp 28 | algorithm 29 | - 30 | cassert 31 | - 32 | ciso646 33 | - 34 | cstddef 35 | - 36 | functional 37 | - 38 | initializer_list 39 | - 40 | iosfwd 41 | - 42 | iterator 43 | - 44 | memory 45 | - 46 | numeric 47 | - 48 | string 49 | - 50 | utility 51 | - 52 | vector 53 | - 54 | utility 55 | - 56 | algorithm 57 | - 58 | array 59 | - 60 | ciso646 61 | - 62 | forward_list 63 | - 64 | iterator 65 | - 66 | map 67 | - 68 | string 69 | - 70 | tuple 71 | - 72 | type_traits 73 | - 74 | unordered_map 75 | - 76 | utility 77 | - 78 | valarray 79 | - 80 | exception 81 | - 82 | stdexcept 83 | - 84 | string 85 | - 86 | cstddef 87 | - 88 | utility 89 | - 90 | cstdlib 91 | - 92 | ciso646 93 | - 94 | cstddef 95 | - 96 | type_traits 97 | - 98 | ciso646 99 | - 100 | limits 101 | - 102 | type_traits 103 | - 104 | utility 105 | - 106 | iterator 107 | - 108 | type_traits 109 | - 110 | cstdint 111 | - 112 | map 113 | - 114 | memory 115 | - 116 | string 117 | - 118 | vector 119 | - 120 | array 121 | - 122 | ciso646 123 | - 124 | cstddef 125 | - 126 | cstdint 127 | - 128 | string 129 | - 130 | algorithm 131 | - 132 | ciso646 133 | - 134 | iterator 135 | - 136 | string 137 | - 138 | tuple 139 | - 140 | type_traits 141 | - 142 | utility 143 | - 144 | valarray 145 | - 146 | vector 147 | - 148 | cstddef 149 | - 150 | iterator 151 | - 152 | string 153 | - 154 | tuple 155 | - 156 | algorithm 157 | - 158 | array 159 | - 160 | cassert 161 | - 162 | cmath 163 | - 164 | cstddef 165 | - 166 | cstdint 167 | - 168 | cstdio 169 | - 170 | cstring 171 | - 172 | iterator 173 | - 174 | limits 175 | - 176 | string 177 | - 178 | utility 179 | - 180 | array 181 | - 182 | cassert 183 | - 184 | cstddef 185 | - 186 | cstdio 187 | - 188 | cstring 189 | - 190 | istream 191 | - 192 | iterator 193 | - 194 | memory 195 | - 196 | numeric 197 | - 198 | string 199 | - 200 | type_traits 201 | - 202 | utility 203 | - 204 | cassert 205 | - 206 | cstddef 207 | - 208 | string 209 | - 210 | utility 211 | - 212 | vector 213 | - 214 | cstdint 215 | - 216 | utility 217 | - 218 | string 219 | - 220 | array 221 | - 222 | clocale 223 | - 224 | cstddef 225 | - 226 | cstdio 227 | - 228 | cstdlib 229 | - 230 | initializer_list 231 | - 232 | string 233 | - 234 | utility 235 | - 236 | vector 237 | - 238 | cassert 239 | - 240 | cmath 241 | - 242 | cstdint 243 | - 244 | functional 245 | - 246 | string 247 | - 248 | utility 249 | - 250 | vector 251 | - 252 | cstddef 253 | - 254 | limits 255 | - 256 | ciso646 257 | - 258 | iterator 259 | - 260 | type_traits 261 | - 262 | cstddef 263 | - 264 | iterator 265 | - 266 | utility 267 | - 268 | algorithm 269 | - 270 | cassert 271 | - 272 | cctype 273 | - 274 | numeric 275 | - 276 | string 277 | - 278 | utility 279 | - 280 | vector 281 | - 282 | initializer_list 283 | - 284 | utility 285 | - 286 | algorithm 287 | - 288 | array 289 | - 290 | cstdint 291 | - 292 | cstring 293 | - 294 | limits 295 | - 296 | string 297 | - 298 | algorithm 299 | - 300 | cstddef 301 | - 302 | ios 303 | - 304 | iterator 305 | - 306 | memory 307 | - 308 | ostream 309 | - 310 | string 311 | - 312 | vector 313 | - 314 | algorithm 315 | - 316 | array 317 | - 318 | cassert 319 | - 320 | ciso646 321 | - 322 | clocale 323 | - 324 | cmath 325 | - 326 | cstddef 327 | - 328 | cstdint 329 | - 330 | cstdio 331 | - 332 | limits 333 | - 334 | string 335 | - 336 | type_traits 337 | - 338 | utility 339 | - 340 | array 341 | - 342 | cassert 343 | - 344 | ciso646 345 | - 346 | cmath 347 | - 348 | cstdint 349 | - 350 | cstring 351 | - 352 | limits 353 | - 354 | type_traits 355 | - 356 | 357 | /home/ik/桌面/Service/src/client/main.cpp 358 | iostream 359 | - 360 | thread 361 | - 362 | string 363 | - 364 | vector 365 | - 366 | chrono 367 | - 368 | ctime 369 | - 370 | unistd.h 371 | - 372 | sys/socket.h 373 | - 374 | sys/types.h 375 | - 376 | netinet/in.h 377 | - 378 | arpa/inet.h 379 | - 380 | json.hpp 381 | /home/ik/桌面/Service/src/client/json.hpp 382 | Group.hpp 383 | /home/ik/桌面/Service/src/client/Group.hpp 384 | User.hpp 385 | /home/ik/桌面/Service/src/client/User.hpp 386 | public.hpp 387 | /home/ik/桌面/Service/src/client/public.hpp 388 | 389 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake: -------------------------------------------------------------------------------- 1 | set(CMAKE_CXX_COMPILER "/usr/bin/g++-7") 2 | set(CMAKE_CXX_COMPILER_ARG1 "") 3 | set(CMAKE_CXX_COMPILER_ID "GNU") 4 | set(CMAKE_CXX_COMPILER_VERSION "7.5.0") 5 | set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") 6 | set(CMAKE_CXX_COMPILER_WRAPPER "") 7 | set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") 8 | set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") 9 | set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") 10 | set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") 11 | set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") 12 | set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") 13 | 14 | set(CMAKE_CXX_PLATFORM_ID "Linux") 15 | set(CMAKE_CXX_SIMULATE_ID "") 16 | set(CMAKE_CXX_SIMULATE_VERSION "") 17 | 18 | 19 | 20 | set(CMAKE_AR "/usr/bin/ar") 21 | set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-7") 22 | set(CMAKE_RANLIB "/usr/bin/ranlib") 23 | set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") 24 | set(CMAKE_LINKER "/usr/bin/ld") 25 | set(CMAKE_COMPILER_IS_GNUCXX 1) 26 | set(CMAKE_CXX_COMPILER_LOADED 1) 27 | set(CMAKE_CXX_COMPILER_WORKS TRUE) 28 | set(CMAKE_CXX_ABI_COMPILED TRUE) 29 | set(CMAKE_COMPILER_IS_MINGW ) 30 | set(CMAKE_COMPILER_IS_CYGWIN ) 31 | if(CMAKE_COMPILER_IS_CYGWIN) 32 | set(CYGWIN 1) 33 | set(UNIX 1) 34 | endif() 35 | 36 | set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") 37 | 38 | if(CMAKE_COMPILER_IS_MINGW) 39 | set(MINGW 1) 40 | endif() 41 | set(CMAKE_CXX_COMPILER_ID_RUN 1) 42 | set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) 43 | set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) 44 | set(CMAKE_CXX_LINKER_PREFERENCE 30) 45 | set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) 46 | 47 | # Save compiler ABI information. 48 | set(CMAKE_CXX_SIZEOF_DATA_PTR "8") 49 | set(CMAKE_CXX_COMPILER_ABI "ELF") 50 | set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") 51 | 52 | if(CMAKE_CXX_SIZEOF_DATA_PTR) 53 | set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") 54 | endif() 55 | 56 | if(CMAKE_CXX_COMPILER_ABI) 57 | set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") 58 | endif() 59 | 60 | if(CMAKE_CXX_LIBRARY_ARCHITECTURE) 61 | set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") 62 | endif() 63 | 64 | set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") 65 | if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) 66 | set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") 67 | endif() 68 | 69 | 70 | 71 | 72 | 73 | set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") 74 | set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") 75 | set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") 76 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/depend.make: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/ChatServer.hpp 5 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/ChatService.hpp 6 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/FriendModel.hpp 7 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/Group.hpp 8 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/GroupModel.hpp 9 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/GroupUser.hpp 10 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/OfflineMessageModel.hpp 11 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/User.hpp 12 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/model/UserModel.hpp 13 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../include/server/redis/Redis.hpp 14 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../thirdparty/json.hpp 15 | src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o: ../src/server/ChatServer.cpp 16 | 17 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/public.hpp 18 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/ChatService.hpp 19 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/FriendModel.hpp 20 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/Group.hpp 21 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/GroupModel.hpp 22 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/GroupUser.hpp 23 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/OfflineMessageModel.hpp 24 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/User.hpp 25 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/model/UserModel.hpp 26 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../include/server/redis/Redis.hpp 27 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../thirdparty/json.hpp 28 | src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o: ../src/server/ChatService.cpp 29 | 30 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/ChatServer.hpp 31 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/ChatService.hpp 32 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/FriendModel.hpp 33 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/Group.hpp 34 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/GroupModel.hpp 35 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/GroupUser.hpp 36 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/OfflineMessageModel.hpp 37 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/User.hpp 38 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/model/UserModel.hpp 39 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../include/server/redis/Redis.hpp 40 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../thirdparty/json.hpp 41 | src/server/CMakeFiles/ChatServer.dir/main.cpp.o: ../src/server/main.cpp 42 | 43 | src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o: ../include/server/db/MySQL.hpp 44 | src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o: ../include/server/model/FriendModel.hpp 45 | src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o: ../include/server/model/User.hpp 46 | src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o: ../src/server/model/FriendModel.cpp 47 | 48 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../include/server/db/MySQL.hpp 49 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../include/server/model/Group.hpp 50 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../include/server/model/GroupModel.hpp 51 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../include/server/model/GroupUser.hpp 52 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../include/server/model/User.hpp 53 | src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o: ../src/server/model/GroupModel.cpp 54 | 55 | src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o: ../include/server/db/MySQL.hpp 56 | src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o: ../include/server/model/OfflineMessageModel.hpp 57 | src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o: ../src/server/model/OfflineMessageModel.cpp 58 | 59 | src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o: ../include/server/db/MySQL.hpp 60 | src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o: ../include/server/model/User.hpp 61 | src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o: ../include/server/model/UserModel.hpp 62 | src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o: ../src/server/model/UserModel.cpp 63 | 64 | src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o: ../include/server/redis/Redis.hpp 65 | src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o: ../src/server/redis/Redis.cpp 66 | 67 | -------------------------------------------------------------------------------- /Service/build/Makefile: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Default target executed when no arguments are given to make. 5 | default_target: all 6 | 7 | .PHONY : default_target 8 | 9 | # Allow only one "make -f Makefile2" at a time, but pass parallelism. 10 | .NOTPARALLEL: 11 | 12 | 13 | #============================================================================= 14 | # Special targets provided by cmake. 15 | 16 | # Disable implicit rules so canonical targets will work. 17 | .SUFFIXES: 18 | 19 | 20 | # Remove some rules from gmake that .SUFFIXES does not remove. 21 | SUFFIXES = 22 | 23 | .SUFFIXES: .hpux_make_needs_suffix_list 24 | 25 | 26 | # Suppress display of executed commands. 27 | $(VERBOSE).SILENT: 28 | 29 | 30 | # A target that is always out of date. 31 | cmake_force: 32 | 33 | .PHONY : cmake_force 34 | 35 | #============================================================================= 36 | # Set environment variables for the build. 37 | 38 | # The shell in which to execute make rules. 39 | SHELL = /bin/sh 40 | 41 | # The CMake executable. 42 | CMAKE_COMMAND = /usr/bin/cmake 43 | 44 | # The command to remove a file. 45 | RM = /usr/bin/cmake -E remove -f 46 | 47 | # Escaping for special characters. 48 | EQUALS = = 49 | 50 | # The top-level source directory on which CMake was run. 51 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 52 | 53 | # The top-level build directory on which CMake was run. 54 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 55 | 56 | #============================================================================= 57 | # Targets provided globally by CMake. 58 | 59 | # Special rule for the target rebuild_cache 60 | rebuild_cache: 61 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." 62 | /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) 63 | .PHONY : rebuild_cache 64 | 65 | # Special rule for the target rebuild_cache 66 | rebuild_cache/fast: rebuild_cache 67 | 68 | .PHONY : rebuild_cache/fast 69 | 70 | # Special rule for the target edit_cache 71 | edit_cache: 72 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." 73 | /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. 74 | .PHONY : edit_cache 75 | 76 | # Special rule for the target edit_cache 77 | edit_cache/fast: edit_cache 78 | 79 | .PHONY : edit_cache/fast 80 | 81 | # The main all target 82 | all: cmake_check_build_system 83 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles /home/ik/桌面/Service/build/CMakeFiles/progress.marks 84 | $(MAKE) -f CMakeFiles/Makefile2 all 85 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 86 | .PHONY : all 87 | 88 | # The main clean target 89 | clean: 90 | $(MAKE) -f CMakeFiles/Makefile2 clean 91 | .PHONY : clean 92 | 93 | # The main clean target 94 | clean/fast: clean 95 | 96 | .PHONY : clean/fast 97 | 98 | # Prepare targets for installation. 99 | preinstall: all 100 | $(MAKE) -f CMakeFiles/Makefile2 preinstall 101 | .PHONY : preinstall 102 | 103 | # Prepare targets for installation. 104 | preinstall/fast: 105 | $(MAKE) -f CMakeFiles/Makefile2 preinstall 106 | .PHONY : preinstall/fast 107 | 108 | # clear depends 109 | depend: 110 | $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 111 | .PHONY : depend 112 | 113 | #============================================================================= 114 | # Target rules for targets named ChatServer 115 | 116 | # Build rule for target. 117 | ChatServer: cmake_check_build_system 118 | $(MAKE) -f CMakeFiles/Makefile2 ChatServer 119 | .PHONY : ChatServer 120 | 121 | # fast build rule for target. 122 | ChatServer/fast: 123 | $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/build 124 | .PHONY : ChatServer/fast 125 | 126 | #============================================================================= 127 | # Target rules for targets named ChatClient 128 | 129 | # Build rule for target. 130 | ChatClient: cmake_check_build_system 131 | $(MAKE) -f CMakeFiles/Makefile2 ChatClient 132 | .PHONY : ChatClient 133 | 134 | # fast build rule for target. 135 | ChatClient/fast: 136 | $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/build 137 | .PHONY : ChatClient/fast 138 | 139 | # Help Target 140 | help: 141 | @echo "The following are some of the valid targets for this Makefile:" 142 | @echo "... all (the default if no target is provided)" 143 | @echo "... clean" 144 | @echo "... depend" 145 | @echo "... rebuild_cache" 146 | @echo "... edit_cache" 147 | @echo "... ChatServer" 148 | @echo "... ChatClient" 149 | .PHONY : help 150 | 151 | 152 | 153 | #============================================================================= 154 | # Special targets to cleanup operation of make. 155 | 156 | # Special rule to run CMake to check the build system integrity. 157 | # No rule that depends on this can have commands that come from listfiles 158 | # because they might be regenerated. 159 | cmake_check_build_system: 160 | $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 161 | .PHONY : cmake_check_build_system 162 | 163 | -------------------------------------------------------------------------------- /Service/build/src/client/CMakeFiles/ChatClient.dir/build.make: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Delete rule output on recipe failure. 5 | .DELETE_ON_ERROR: 6 | 7 | 8 | #============================================================================= 9 | # Special targets provided by cmake. 10 | 11 | # Disable implicit rules so canonical targets will work. 12 | .SUFFIXES: 13 | 14 | 15 | # Remove some rules from gmake that .SUFFIXES does not remove. 16 | SUFFIXES = 17 | 18 | .SUFFIXES: .hpux_make_needs_suffix_list 19 | 20 | 21 | # Suppress display of executed commands. 22 | $(VERBOSE).SILENT: 23 | 24 | 25 | # A target that is always out of date. 26 | cmake_force: 27 | 28 | .PHONY : cmake_force 29 | 30 | #============================================================================= 31 | # Set environment variables for the build. 32 | 33 | # The shell in which to execute make rules. 34 | SHELL = /bin/sh 35 | 36 | # The CMake executable. 37 | CMAKE_COMMAND = /usr/bin/cmake 38 | 39 | # The command to remove a file. 40 | RM = /usr/bin/cmake -E remove -f 41 | 42 | # Escaping for special characters. 43 | EQUALS = = 44 | 45 | # The top-level source directory on which CMake was run. 46 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 47 | 48 | # The top-level build directory on which CMake was run. 49 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 50 | 51 | # Include any dependencies generated for this target. 52 | include src/client/CMakeFiles/ChatClient.dir/depend.make 53 | 54 | # Include the progress variables for this target. 55 | include src/client/CMakeFiles/ChatClient.dir/progress.make 56 | 57 | # Include the compile flags for this target's objects. 58 | include src/client/CMakeFiles/ChatClient.dir/flags.make 59 | 60 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: src/client/CMakeFiles/ChatClient.dir/flags.make 61 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o: ../src/client/main.cpp 62 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ik/桌面/Service/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object src/client/CMakeFiles/ChatClient.dir/main.cpp.o" 63 | cd /home/ik/桌面/Service/build/src/client && /usr/bin/g++-7 $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/ChatClient.dir/main.cpp.o -c /home/ik/桌面/Service/src/client/main.cpp 64 | 65 | src/client/CMakeFiles/ChatClient.dir/main.cpp.i: cmake_force 66 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/ChatClient.dir/main.cpp.i" 67 | cd /home/ik/桌面/Service/build/src/client && /usr/bin/g++-7 $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ik/桌面/Service/src/client/main.cpp > CMakeFiles/ChatClient.dir/main.cpp.i 68 | 69 | src/client/CMakeFiles/ChatClient.dir/main.cpp.s: cmake_force 70 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/ChatClient.dir/main.cpp.s" 71 | cd /home/ik/桌面/Service/build/src/client && /usr/bin/g++-7 $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ik/桌面/Service/src/client/main.cpp -o CMakeFiles/ChatClient.dir/main.cpp.s 72 | 73 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o.requires: 74 | 75 | .PHONY : src/client/CMakeFiles/ChatClient.dir/main.cpp.o.requires 76 | 77 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o.provides: src/client/CMakeFiles/ChatClient.dir/main.cpp.o.requires 78 | $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/main.cpp.o.provides.build 79 | .PHONY : src/client/CMakeFiles/ChatClient.dir/main.cpp.o.provides 80 | 81 | src/client/CMakeFiles/ChatClient.dir/main.cpp.o.provides.build: src/client/CMakeFiles/ChatClient.dir/main.cpp.o 82 | 83 | 84 | # Object files for target ChatClient 85 | ChatClient_OBJECTS = \ 86 | "CMakeFiles/ChatClient.dir/main.cpp.o" 87 | 88 | # External object files for target ChatClient 89 | ChatClient_EXTERNAL_OBJECTS = 90 | 91 | ../bin/ChatClient: src/client/CMakeFiles/ChatClient.dir/main.cpp.o 92 | ../bin/ChatClient: src/client/CMakeFiles/ChatClient.dir/build.make 93 | ../bin/ChatClient: src/client/CMakeFiles/ChatClient.dir/link.txt 94 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/ik/桌面/Service/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../../bin/ChatClient" 95 | cd /home/ik/桌面/Service/build/src/client && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ChatClient.dir/link.txt --verbose=$(VERBOSE) 96 | 97 | # Rule to build all files generated by this target. 98 | src/client/CMakeFiles/ChatClient.dir/build: ../bin/ChatClient 99 | 100 | .PHONY : src/client/CMakeFiles/ChatClient.dir/build 101 | 102 | src/client/CMakeFiles/ChatClient.dir/requires: src/client/CMakeFiles/ChatClient.dir/main.cpp.o.requires 103 | 104 | .PHONY : src/client/CMakeFiles/ChatClient.dir/requires 105 | 106 | src/client/CMakeFiles/ChatClient.dir/clean: 107 | cd /home/ik/桌面/Service/build/src/client && $(CMAKE_COMMAND) -P CMakeFiles/ChatClient.dir/cmake_clean.cmake 108 | .PHONY : src/client/CMakeFiles/ChatClient.dir/clean 109 | 110 | src/client/CMakeFiles/ChatClient.dir/depend: 111 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/ik/桌面/Service /home/ik/桌面/Service/src/client /home/ik/桌面/Service/build /home/ik/桌面/Service/build/src/client /home/ik/桌面/Service/build/src/client/CMakeFiles/ChatClient.dir/DependInfo.cmake --color=$(COLOR) 112 | .PHONY : src/client/CMakeFiles/ChatClient.dir/depend 113 | 114 | -------------------------------------------------------------------------------- /Service/build/src/client/Makefile: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Default target executed when no arguments are given to make. 5 | default_target: all 6 | 7 | .PHONY : default_target 8 | 9 | # Allow only one "make -f Makefile2" at a time, but pass parallelism. 10 | .NOTPARALLEL: 11 | 12 | 13 | #============================================================================= 14 | # Special targets provided by cmake. 15 | 16 | # Disable implicit rules so canonical targets will work. 17 | .SUFFIXES: 18 | 19 | 20 | # Remove some rules from gmake that .SUFFIXES does not remove. 21 | SUFFIXES = 22 | 23 | .SUFFIXES: .hpux_make_needs_suffix_list 24 | 25 | 26 | # Suppress display of executed commands. 27 | $(VERBOSE).SILENT: 28 | 29 | 30 | # A target that is always out of date. 31 | cmake_force: 32 | 33 | .PHONY : cmake_force 34 | 35 | #============================================================================= 36 | # Set environment variables for the build. 37 | 38 | # The shell in which to execute make rules. 39 | SHELL = /bin/sh 40 | 41 | # The CMake executable. 42 | CMAKE_COMMAND = /usr/bin/cmake 43 | 44 | # The command to remove a file. 45 | RM = /usr/bin/cmake -E remove -f 46 | 47 | # Escaping for special characters. 48 | EQUALS = = 49 | 50 | # The top-level source directory on which CMake was run. 51 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 52 | 53 | # The top-level build directory on which CMake was run. 54 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 55 | 56 | #============================================================================= 57 | # Targets provided globally by CMake. 58 | 59 | # Special rule for the target rebuild_cache 60 | rebuild_cache: 61 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." 62 | /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) 63 | .PHONY : rebuild_cache 64 | 65 | # Special rule for the target rebuild_cache 66 | rebuild_cache/fast: rebuild_cache 67 | 68 | .PHONY : rebuild_cache/fast 69 | 70 | # Special rule for the target edit_cache 71 | edit_cache: 72 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." 73 | /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. 74 | .PHONY : edit_cache 75 | 76 | # Special rule for the target edit_cache 77 | edit_cache/fast: edit_cache 78 | 79 | .PHONY : edit_cache/fast 80 | 81 | # The main all target 82 | all: cmake_check_build_system 83 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles /home/ik/桌面/Service/build/src/client/CMakeFiles/progress.marks 84 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/client/all 85 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 86 | .PHONY : all 87 | 88 | # The main clean target 89 | clean: 90 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/client/clean 91 | .PHONY : clean 92 | 93 | # The main clean target 94 | clean/fast: clean 95 | 96 | .PHONY : clean/fast 97 | 98 | # Prepare targets for installation. 99 | preinstall: all 100 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/client/preinstall 101 | .PHONY : preinstall 102 | 103 | # Prepare targets for installation. 104 | preinstall/fast: 105 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/client/preinstall 106 | .PHONY : preinstall/fast 107 | 108 | # clear depends 109 | depend: 110 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 111 | .PHONY : depend 112 | 113 | # Convenience name for target. 114 | src/client/CMakeFiles/ChatClient.dir/rule: 115 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/client/CMakeFiles/ChatClient.dir/rule 116 | .PHONY : src/client/CMakeFiles/ChatClient.dir/rule 117 | 118 | # Convenience name for target. 119 | ChatClient: src/client/CMakeFiles/ChatClient.dir/rule 120 | 121 | .PHONY : ChatClient 122 | 123 | # fast build rule for target. 124 | ChatClient/fast: 125 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/build 126 | .PHONY : ChatClient/fast 127 | 128 | main.o: main.cpp.o 129 | 130 | .PHONY : main.o 131 | 132 | # target to build an object file 133 | main.cpp.o: 134 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/main.cpp.o 135 | .PHONY : main.cpp.o 136 | 137 | main.i: main.cpp.i 138 | 139 | .PHONY : main.i 140 | 141 | # target to preprocess a source file 142 | main.cpp.i: 143 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/main.cpp.i 144 | .PHONY : main.cpp.i 145 | 146 | main.s: main.cpp.s 147 | 148 | .PHONY : main.s 149 | 150 | # target to generate assembly for a file 151 | main.cpp.s: 152 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/main.cpp.s 153 | .PHONY : main.cpp.s 154 | 155 | # Help Target 156 | help: 157 | @echo "The following are some of the valid targets for this Makefile:" 158 | @echo "... all (the default if no target is provided)" 159 | @echo "... clean" 160 | @echo "... depend" 161 | @echo "... rebuild_cache" 162 | @echo "... ChatClient" 163 | @echo "... edit_cache" 164 | @echo "... main.o" 165 | @echo "... main.i" 166 | @echo "... main.s" 167 | .PHONY : help 168 | 169 | 170 | 171 | #============================================================================= 172 | # Special targets to cleanup operation of make. 173 | 174 | # Special rule to run CMake to check the build system integrity. 175 | # No rule that depends on this can have commands that come from listfiles 176 | # because they might be regenerated. 177 | cmake_check_build_system: 178 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 179 | .PHONY : cmake_check_build_system 180 | 181 | -------------------------------------------------------------------------------- /Service/build/src/server/CMakeFiles/ChatServer.dir/CXX.includecache: -------------------------------------------------------------------------------- 1 | #IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) 2 | 3 | #IncludeRegexScan: ^.*$ 4 | 5 | #IncludeRegexComplain: ^$ 6 | 7 | #IncludeRegexTransform: 8 | 9 | ../include/public.hpp 10 | 11 | ../include/server/ChatServer.hpp 12 | muduo/net/TcpServer.h 13 | - 14 | muduo/net/EventLoop.h 15 | - 16 | 17 | ../include/server/ChatService.hpp 18 | unordered_map 19 | - 20 | functional 21 | - 22 | mutex 23 | - 24 | muduo/net/TcpConnection.h 25 | - 26 | json.hpp 27 | ../include/server/json.hpp 28 | UserModel.hpp 29 | ../include/server/UserModel.hpp 30 | OfflineMessageModel.hpp 31 | ../include/server/OfflineMessageModel.hpp 32 | FriendModel.hpp 33 | ../include/server/FriendModel.hpp 34 | GroupModel.hpp 35 | ../include/server/GroupModel.hpp 36 | Redis.hpp 37 | ../include/server/Redis.hpp 38 | 39 | ../include/server/db/MySQL.hpp 40 | string 41 | - 42 | mysql/mysql.h 43 | - 44 | muduo/base/Logging.h 45 | - 46 | 47 | ../include/server/model/FriendModel.hpp 48 | vector 49 | - 50 | User.hpp 51 | ../include/server/model/User.hpp 52 | 53 | ../include/server/model/Group.hpp 54 | GroupUser.hpp 55 | ../include/server/model/GroupUser.hpp 56 | string 57 | - 58 | vector 59 | - 60 | 61 | ../include/server/model/GroupModel.hpp 62 | Group.hpp 63 | ../include/server/model/Group.hpp 64 | vector 65 | - 66 | string 67 | - 68 | 69 | ../include/server/model/GroupUser.hpp 70 | User.hpp 71 | ../include/server/model/User.hpp 72 | 73 | ../include/server/model/OfflineMessageModel.hpp 74 | string 75 | - 76 | vector 77 | - 78 | 79 | ../include/server/model/User.hpp 80 | string 81 | - 82 | 83 | ../include/server/model/UserModel.hpp 84 | User.hpp 85 | ../include/server/model/User.hpp 86 | 87 | ../include/server/redis/Redis.hpp 88 | hiredis/hiredis.h 89 | - 90 | thread 91 | - 92 | functional 93 | - 94 | 95 | ../thirdparty/json.hpp 96 | algorithm 97 | - 98 | cassert 99 | - 100 | ciso646 101 | - 102 | cstddef 103 | - 104 | functional 105 | - 106 | initializer_list 107 | - 108 | iosfwd 109 | - 110 | iterator 111 | - 112 | memory 113 | - 114 | numeric 115 | - 116 | string 117 | - 118 | utility 119 | - 120 | vector 121 | - 122 | utility 123 | - 124 | algorithm 125 | - 126 | array 127 | - 128 | ciso646 129 | - 130 | forward_list 131 | - 132 | iterator 133 | - 134 | map 135 | - 136 | string 137 | - 138 | tuple 139 | - 140 | type_traits 141 | - 142 | unordered_map 143 | - 144 | utility 145 | - 146 | valarray 147 | - 148 | exception 149 | - 150 | stdexcept 151 | - 152 | string 153 | - 154 | cstddef 155 | - 156 | utility 157 | - 158 | cstdlib 159 | - 160 | ciso646 161 | - 162 | cstddef 163 | - 164 | type_traits 165 | - 166 | ciso646 167 | - 168 | limits 169 | - 170 | type_traits 171 | - 172 | utility 173 | - 174 | iterator 175 | - 176 | type_traits 177 | - 178 | cstdint 179 | - 180 | map 181 | - 182 | memory 183 | - 184 | string 185 | - 186 | vector 187 | - 188 | array 189 | - 190 | ciso646 191 | - 192 | cstddef 193 | - 194 | cstdint 195 | - 196 | string 197 | - 198 | algorithm 199 | - 200 | ciso646 201 | - 202 | iterator 203 | - 204 | string 205 | - 206 | tuple 207 | - 208 | type_traits 209 | - 210 | utility 211 | - 212 | valarray 213 | - 214 | vector 215 | - 216 | cstddef 217 | - 218 | iterator 219 | - 220 | string 221 | - 222 | tuple 223 | - 224 | algorithm 225 | - 226 | array 227 | - 228 | cassert 229 | - 230 | cmath 231 | - 232 | cstddef 233 | - 234 | cstdint 235 | - 236 | cstdio 237 | - 238 | cstring 239 | - 240 | iterator 241 | - 242 | limits 243 | - 244 | string 245 | - 246 | utility 247 | - 248 | array 249 | - 250 | cassert 251 | - 252 | cstddef 253 | - 254 | cstdio 255 | - 256 | cstring 257 | - 258 | istream 259 | - 260 | iterator 261 | - 262 | memory 263 | - 264 | numeric 265 | - 266 | string 267 | - 268 | type_traits 269 | - 270 | utility 271 | - 272 | cassert 273 | - 274 | cstddef 275 | - 276 | string 277 | - 278 | utility 279 | - 280 | vector 281 | - 282 | cstdint 283 | - 284 | utility 285 | - 286 | string 287 | - 288 | array 289 | - 290 | clocale 291 | - 292 | cstddef 293 | - 294 | cstdio 295 | - 296 | cstdlib 297 | - 298 | initializer_list 299 | - 300 | string 301 | - 302 | utility 303 | - 304 | vector 305 | - 306 | cassert 307 | - 308 | cmath 309 | - 310 | cstdint 311 | - 312 | functional 313 | - 314 | string 315 | - 316 | utility 317 | - 318 | vector 319 | - 320 | cstddef 321 | - 322 | limits 323 | - 324 | ciso646 325 | - 326 | iterator 327 | - 328 | type_traits 329 | - 330 | cstddef 331 | - 332 | iterator 333 | - 334 | utility 335 | - 336 | algorithm 337 | - 338 | cassert 339 | - 340 | cctype 341 | - 342 | numeric 343 | - 344 | string 345 | - 346 | utility 347 | - 348 | vector 349 | - 350 | initializer_list 351 | - 352 | utility 353 | - 354 | algorithm 355 | - 356 | array 357 | - 358 | cstdint 359 | - 360 | cstring 361 | - 362 | limits 363 | - 364 | string 365 | - 366 | algorithm 367 | - 368 | cstddef 369 | - 370 | ios 371 | - 372 | iterator 373 | - 374 | memory 375 | - 376 | ostream 377 | - 378 | string 379 | - 380 | vector 381 | - 382 | algorithm 383 | - 384 | array 385 | - 386 | cassert 387 | - 388 | ciso646 389 | - 390 | clocale 391 | - 392 | cmath 393 | - 394 | cstddef 395 | - 396 | cstdint 397 | - 398 | cstdio 399 | - 400 | limits 401 | - 402 | string 403 | - 404 | type_traits 405 | - 406 | utility 407 | - 408 | array 409 | - 410 | cassert 411 | - 412 | ciso646 413 | - 414 | cmath 415 | - 416 | cstdint 417 | - 418 | cstring 419 | - 420 | limits 421 | - 422 | type_traits 423 | - 424 | 425 | /home/ik/桌面/Service/src/server/ChatServer.cpp 426 | functional 427 | - 428 | string 429 | - 430 | iostream 431 | - 432 | ChatServer.hpp 433 | /home/ik/桌面/Service/src/server/ChatServer.hpp 434 | ChatService.hpp 435 | /home/ik/桌面/Service/src/server/ChatService.hpp 436 | json.hpp 437 | /home/ik/桌面/Service/src/server/json.hpp 438 | 439 | /home/ik/桌面/Service/src/server/ChatService.cpp 440 | muduo/base/Logging.h 441 | - 442 | vector 443 | - 444 | map 445 | - 446 | iostream 447 | - 448 | ChatService.hpp 449 | /home/ik/桌面/Service/src/server/ChatService.hpp 450 | public.hpp 451 | /home/ik/桌面/Service/src/server/public.hpp 452 | 453 | /home/ik/桌面/Service/src/server/main.cpp 454 | iostream 455 | - 456 | signal.h 457 | - 458 | ChatServer.hpp 459 | /home/ik/桌面/Service/src/server/ChatServer.hpp 460 | ChatService.hpp 461 | /home/ik/桌面/Service/src/server/ChatService.hpp 462 | 463 | /home/ik/桌面/Service/src/server/model/FriendModel.cpp 464 | FriendModel.hpp 465 | /home/ik/桌面/Service/src/server/model/FriendModel.hpp 466 | MySQL.hpp 467 | /home/ik/桌面/Service/src/server/model/MySQL.hpp 468 | 469 | /home/ik/桌面/Service/src/server/model/GroupModel.cpp 470 | GroupModel.hpp 471 | /home/ik/桌面/Service/src/server/model/GroupModel.hpp 472 | MySQL.hpp 473 | /home/ik/桌面/Service/src/server/model/MySQL.hpp 474 | iostream 475 | - 476 | 477 | /home/ik/桌面/Service/src/server/model/OfflineMessageModel.cpp 478 | OfflineMessageModel.hpp 479 | /home/ik/桌面/Service/src/server/model/OfflineMessageModel.hpp 480 | MySQL.hpp 481 | /home/ik/桌面/Service/src/server/model/MySQL.hpp 482 | 483 | /home/ik/桌面/Service/src/server/model/UserModel.cpp 484 | iostream 485 | - 486 | UserModel.hpp 487 | /home/ik/桌面/Service/src/server/model/UserModel.hpp 488 | MySQL.hpp 489 | /home/ik/桌面/Service/src/server/model/MySQL.hpp 490 | 491 | /home/ik/桌面/Service/src/server/redis/Redis.cpp 492 | Redis.hpp 493 | /home/ik/桌面/Service/src/server/redis/Redis.hpp 494 | iostream 495 | - 496 | 497 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/Makefile2: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Default target executed when no arguments are given to make. 5 | default_target: all 6 | 7 | .PHONY : default_target 8 | 9 | # The main recursive all target 10 | all: 11 | 12 | .PHONY : all 13 | 14 | # The main recursive preinstall target 15 | preinstall: 16 | 17 | .PHONY : preinstall 18 | 19 | #============================================================================= 20 | # Special targets provided by cmake. 21 | 22 | # Disable implicit rules so canonical targets will work. 23 | .SUFFIXES: 24 | 25 | 26 | # Remove some rules from gmake that .SUFFIXES does not remove. 27 | SUFFIXES = 28 | 29 | .SUFFIXES: .hpux_make_needs_suffix_list 30 | 31 | 32 | # Suppress display of executed commands. 33 | $(VERBOSE).SILENT: 34 | 35 | 36 | # A target that is always out of date. 37 | cmake_force: 38 | 39 | .PHONY : cmake_force 40 | 41 | #============================================================================= 42 | # Set environment variables for the build. 43 | 44 | # The shell in which to execute make rules. 45 | SHELL = /bin/sh 46 | 47 | # The CMake executable. 48 | CMAKE_COMMAND = /usr/bin/cmake 49 | 50 | # The command to remove a file. 51 | RM = /usr/bin/cmake -E remove -f 52 | 53 | # Escaping for special characters. 54 | EQUALS = = 55 | 56 | # The top-level source directory on which CMake was run. 57 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 58 | 59 | # The top-level build directory on which CMake was run. 60 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 61 | 62 | #============================================================================= 63 | # Directory level rules for directory src 64 | 65 | # Convenience name for "all" pass in the directory. 66 | src/all: src/server/all 67 | src/all: src/client/all 68 | 69 | .PHONY : src/all 70 | 71 | # Convenience name for "clean" pass in the directory. 72 | src/clean: src/server/clean 73 | src/clean: src/client/clean 74 | 75 | .PHONY : src/clean 76 | 77 | # Convenience name for "preinstall" pass in the directory. 78 | src/preinstall: src/server/preinstall 79 | src/preinstall: src/client/preinstall 80 | 81 | .PHONY : src/preinstall 82 | 83 | #============================================================================= 84 | # Directory level rules for directory src/server 85 | 86 | # Convenience name for "all" pass in the directory. 87 | src/server/all: src/server/CMakeFiles/ChatServer.dir/all 88 | 89 | .PHONY : src/server/all 90 | 91 | # Convenience name for "clean" pass in the directory. 92 | src/server/clean: src/server/CMakeFiles/ChatServer.dir/clean 93 | 94 | .PHONY : src/server/clean 95 | 96 | # Convenience name for "preinstall" pass in the directory. 97 | src/server/preinstall: 98 | 99 | .PHONY : src/server/preinstall 100 | 101 | #============================================================================= 102 | # Target rules for target src/server/CMakeFiles/ChatServer.dir 103 | 104 | # All Build rule for target. 105 | src/server/CMakeFiles/ChatServer.dir/all: 106 | $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/depend 107 | $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/build 108 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/ik/桌面/Service/build/CMakeFiles --progress-num=3,4,5,6,7,8,9,10,11 "Built target ChatServer" 109 | .PHONY : src/server/CMakeFiles/ChatServer.dir/all 110 | 111 | # Include target in all. 112 | all: src/server/CMakeFiles/ChatServer.dir/all 113 | 114 | .PHONY : all 115 | 116 | # Build rule for subdir invocation for target. 117 | src/server/CMakeFiles/ChatServer.dir/rule: cmake_check_build_system 118 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 9 119 | $(MAKE) -f CMakeFiles/Makefile2 src/server/CMakeFiles/ChatServer.dir/all 120 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 121 | .PHONY : src/server/CMakeFiles/ChatServer.dir/rule 122 | 123 | # Convenience name for target. 124 | ChatServer: src/server/CMakeFiles/ChatServer.dir/rule 125 | 126 | .PHONY : ChatServer 127 | 128 | # clean rule for target. 129 | src/server/CMakeFiles/ChatServer.dir/clean: 130 | $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/clean 131 | .PHONY : src/server/CMakeFiles/ChatServer.dir/clean 132 | 133 | # clean rule for target. 134 | clean: src/server/CMakeFiles/ChatServer.dir/clean 135 | 136 | .PHONY : clean 137 | 138 | #============================================================================= 139 | # Directory level rules for directory src/client 140 | 141 | # Convenience name for "all" pass in the directory. 142 | src/client/all: src/client/CMakeFiles/ChatClient.dir/all 143 | 144 | .PHONY : src/client/all 145 | 146 | # Convenience name for "clean" pass in the directory. 147 | src/client/clean: src/client/CMakeFiles/ChatClient.dir/clean 148 | 149 | .PHONY : src/client/clean 150 | 151 | # Convenience name for "preinstall" pass in the directory. 152 | src/client/preinstall: 153 | 154 | .PHONY : src/client/preinstall 155 | 156 | #============================================================================= 157 | # Target rules for target src/client/CMakeFiles/ChatClient.dir 158 | 159 | # All Build rule for target. 160 | src/client/CMakeFiles/ChatClient.dir/all: 161 | $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/depend 162 | $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/build 163 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/ik/桌面/Service/build/CMakeFiles --progress-num=1,2 "Built target ChatClient" 164 | .PHONY : src/client/CMakeFiles/ChatClient.dir/all 165 | 166 | # Include target in all. 167 | all: src/client/CMakeFiles/ChatClient.dir/all 168 | 169 | .PHONY : all 170 | 171 | # Build rule for subdir invocation for target. 172 | src/client/CMakeFiles/ChatClient.dir/rule: cmake_check_build_system 173 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 2 174 | $(MAKE) -f CMakeFiles/Makefile2 src/client/CMakeFiles/ChatClient.dir/all 175 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 176 | .PHONY : src/client/CMakeFiles/ChatClient.dir/rule 177 | 178 | # Convenience name for target. 179 | ChatClient: src/client/CMakeFiles/ChatClient.dir/rule 180 | 181 | .PHONY : ChatClient 182 | 183 | # clean rule for target. 184 | src/client/CMakeFiles/ChatClient.dir/clean: 185 | $(MAKE) -f src/client/CMakeFiles/ChatClient.dir/build.make src/client/CMakeFiles/ChatClient.dir/clean 186 | .PHONY : src/client/CMakeFiles/ChatClient.dir/clean 187 | 188 | # clean rule for target. 189 | clean: src/client/CMakeFiles/ChatClient.dir/clean 190 | 191 | .PHONY : clean 192 | 193 | #============================================================================= 194 | # Special targets to cleanup operation of make. 195 | 196 | # Special rule to run CMake to check the build system integrity. 197 | # No rule that depends on this can have commands that come from listfiles 198 | # because they might be regenerated. 199 | cmake_check_build_system: 200 | $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 201 | .PHONY : cmake_check_build_system 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # - 2 | 基于muduo网络库的集群聊天服务器 3 | 4 | 作者:shenmingik 5 | 6 | 邮箱:2107810343@qq.com 7 | 8 | 时间:2021/1/26 22:17 9 | 10 | 开发环境:Ubuntu VS Code 11 | 12 | 编译器:g++ 13 | 14 | 数据库:MySQL 15 | 16 | 编程语言:C++ 17 | 18 | 源码连接: 19 | [微云链接](https://share.weiyun.com/PTtAqitJ) 20 | 21 | # 项目概述 22 | ## 业务流程 23 | 项目大概是模仿QQ去实现一个通讯工具,主要业务分为注册、登录、加好友、查看离线消息、一对一群聊、创建群、加入群、群聊等,详细业务流程关系如下图: 24 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021012713535628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZW5taW5neHVlSVQ=,size_16,color_FFFFFF,t_70) 25 | 26 | 既然是模仿QQ,那么就要有客户端,服务端,存储数据的数据库。这样的话,我们就可以采用MVC架构。 27 | 28 | 但是作为一个集群系统我们是不是该考虑更多的问题? 29 | 30 | - 如何解耦网络层与业务层? 31 | - 要存储那些数据?怎么存储? 32 | - 客户端和服务器端要求的通信格式是什么? 33 | - 如何做到集群? 34 | - 既然是集群,跨服务器通信又该怎么解决? 35 | 36 | # 数据模块 37 | ## 表的设计 38 | 首先就是要解决数据的问题,作为一个聊天系统,我们的服务器端肯定要有用户的信息,比如说账号,用户名,密码等。 39 | 在**登录**的时候,我们可以查询这个表里面的信息对用户身份进行验证,在**注册**的时候,我们则可以往表里面去写入数据。 40 | 41 | **表User:** 42 | 43 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127144426745.png) 44 | 45 | 用户登录之后,首先就是进行聊天业务,我们必须要知道该用户的好友都有谁。 46 | 在**加好友**时,我们就可以往这张表里面去写入信息并在**一对一聊天**时查询这里面的信息去看好友是否在线。 47 | 48 | **表Friend:** 49 | 50 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127144758137.png) 51 | 52 | 但是我们的设计目的又要存储离线消息,这就涉及到离线消息发给谁,谁发的,发的什么三个问题,所以我们又需要一个新表来存储离线消息。这样我们一旦有**离线消息**便可以往这个表里面去写入数据。 53 | 54 | **表OfflineMessage:** 55 | 56 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127145215562.png) 57 | 58 | 然后便是群组业务了,群组中我们需要有一个记录群组信息的表,方便我们**创建群**时往其中去写入数据; 59 | 60 | **表AllGroup:** 61 | 62 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127145609263.png) 63 | 64 | 同时群里面肯定是有群员的,我们就需要一个记录群成员的表,我们在**加入群**的时候,把用户id写入这个表。并且在**发送群消息**的时候查询这个表由服务器向这些成员转发消息。 65 | 66 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127150030734.png) 67 | 68 | ## 数据库模块设计 69 | 在`/include/db/MySQL.hpp`文件中,封装着对数据库的连接、查询、更新、释放连接几个操作。 70 | 71 | 其是数据库模块中设计的最底层,为上层各个表以及其操作模块提供基础的服务。其关系图如下所示: 72 | 73 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127151155139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZW5taW5neHVlSVQ=,size_16,color_FFFFFF,t_70) 74 | 75 | 这里要解释几点: 76 | 77 | - 名字带有model的类都是对数据库的操作类并不负责存储数据,而像User这个类则是负责暂存从数据库中查询到的数据 78 | - FriendModel和OfflineMessageModel则是没有暂存数据的上层类,这是因为对于Friend来说,其数据本身就是一个User,只需要查询到好友的id然后在User表中内联查询一下便可得到信息;对于OfflineMessage这是没有必要 79 | - 这些类都在`/include/model`里面 80 | 81 | # 通信格式 82 | 服务器和客户端的通信采用了JSON来完成数据在网络中的标准传输。 83 | 84 | 对于不同的数据则是采用了不同的格式,具体如下: 85 | 86 | ```cpp 87 | 1.登录 88 | json["msgid"] = LOGIN_MSG; 89 | json["id"] //用户id 90 | json["password"] //密码 91 | 92 | 2.登录反馈 93 | json["msgid"] = LOGIN_MSG_ACK; 94 | json["id"] //登录用户id 95 | json["name"] //登录用户密码 96 | json["offlinemsg"] //离线消息 97 | json["friends"] //好友信息,里面有id、name、state三个字段 98 | json["groups"] //群组信息,里面有id,groupname,groupdesc,users三个字段 99 | //users里面则有id,name,state,role四个字段 100 | json["errno"] //错误字段,错误时被设置成1,用户不在线设置成2 101 | json["errmsg"] //错误信息 102 | 103 | 3.注册 104 | json["msgid"] = REG_MSG; 105 | json["name"] //用户姓名 106 | json["password"] //用户姓名 107 | 108 | 4.注册反馈 109 | json["msgid"] = REG_MSG_ACK; 110 | json["id"] //给用户返回他的id号 111 | json["errno"] //错误信息,失败会被设置为1 112 | 113 | 5.加好友 114 | json["msgid"] = ADD_FRIEND_MSG; 115 | json["id"] //当前用户id 116 | json["friendid"] //要加的好友的id 117 | 118 | 6.一对一聊天 119 | json["msgid"] = ONE_CHAT_MSG; 120 | json["id"] //发送者id 121 | json["name"] //发送者姓名 122 | json["to"] //接受者id 123 | json["msg"] //消息内容 124 | json["time"] //发送时间 125 | 126 | 7.创建群 127 | json["msgid"] = CREATE_GROUP_MSG; 128 | json["id"] //群创建者id 129 | json["groupname"] //群名 130 | json["groupdesc"] //群描述 131 | 132 | 8.加入群 133 | json["msgid"] = ADD_GROUP_MSG; 134 | json["id"] //用户id 135 | json["groupid"] //群id 136 | 137 | 9.群聊 138 | json["msgid"] = GROUP_CHAT_MSG; 139 | json["id"] //发送者id 140 | json["name"] //发送者姓名 141 | json["groupid"] //发送者姓名 142 | json["msg"] //消息内容 143 | json["time"] //发送时间 144 | 145 | 10.注销 146 | json["msgid"] = LOGINOUT_MSG; 147 | json["id"] //要注销的id 148 | ``` 149 | 150 | 这里要解释一下: 151 | - `msgid`字段代表着业务类型,这个在`/include/public.hpp`文件中有详细解释。 152 | - 我们这里并没有User表中的`state`字段,这是因为,这个表示用户是否在线的字段会被服务器自动设置,当用户登录会被设置成online,用户下线或者服务器异常则会被设置成offline 153 | 154 | # 网络和业务模块 155 | ## 网络模块 156 | 在这里网络模块我没有自己去`socket+epoll`这样造轮子,而是选择直接使用了muduo网络库提供的接口。 157 | 158 | 使用muduo网络库有很多好处: 159 | 160 | - 方便,简单 161 | - one loop per thread的设计模型 162 | - muduo封装了线程池 163 | 164 | > **什么是one loop per thread:** 165 | > 这是muduo网络库采用的reactor模型,有点像Nginx的负载均衡,但是也有差别,Nginx采用的是多进程,而muduo是多线程。 166 | > 在muduo设计中,有一个main reactor负责接收来自客户端的连接。然后使用轮询的方式给sub reactor去分配连接,而客户端的读写事件都在这个sub reactor上进行。咋样,像不像Nginx的io进程+工作进程的组合 167 | 168 | 而在muduo提供了两个非常重要的注册回调接口:**连接回调**和**消息回调** 169 | 170 | ```cpp 171 | //注册连接回调 172 | server_.setConnectionCallback(bind(&ChatServer::on_connection, this, _1)); 173 | 174 | //注册消息回调 175 | server_.setMessageCallback(bind(&ChatServer::on_message, this, _1, _2, _3)); 176 | ``` 177 | 在这里,我直接和我设置一个处理有关连接事件的方法和处理读写事件的方法。 178 | 179 | ```cpp 180 | //上报连接相关信息的回调函数 181 | void on_connection(const TcpConnectionPtr &); 182 | 183 | //上报读写时间相关信息的回调函数 184 | void on_message(const TcpConnectionPtr &, Buffer *, Timestamp); 185 | ``` 186 | 187 | 当用户进行连接或者断开连接时便会调用on_connection方法进行处理,其执行对象应该是main reactor。 188 | 189 | 发生读写事件时,则会调用on_message方法,执行对象为sub reactor,其内容与网络模块和业务模块解耦合至关重要!!! 190 | 191 | ## 网络模块和业务模块解耦合 192 | 在**通信模块**中,有一个字段`msgid`,其代表着服务器和客户端通信的消息类型,值是一个枚举类型,保存在`/include/public.hpp`文件中,总共有10个取值: 193 | 194 | ```cpp 195 | LOGIN_MSG = 1, //登录消息,绑定login 196 | LOGIN_MSG_ACK, //登录响应消息 197 | REG_MSG, //注册消息,绑定regist 198 | REG_MSG_ACK, //注册响应消息 199 | ONE_CHAT_MSG, //一对一聊天消息 200 | ADD_FRIEND_MSG, //添加好友消息 201 | 202 | CREATE_GROUP_MSG, //创建群聊 203 | ADD_GROUP_MSG, //加入群聊 204 | GROUP_CHAT_MSG, //群聊消息 205 | 206 | LOGINOUT_MSG, //注销消息 207 | ``` 208 | 209 | 根据这些消息类型,我们可以在业务模块添加一个无序关联容器unordered_map,其间为消息类型,值为发生不同类型事件所应该调用方法。 210 | 211 | ```cpp 212 | msg_handler_map_.insert({LOGIN_MSG, bind(&ChatService::login, this, _1, _2, _3)}); 213 | msg_handler_map_.insert({LOGINOUT_MSG, bind(&ChatService::loginout, this, _1, _2, _3)}); 214 | msg_handler_map_.insert({REG_MSG, bind(&ChatService::regist, this, _1, _2, _3)}); 215 | msg_handler_map_.insert({ONE_CHAT_MSG, bind(&ChatService::one_chat, this, _1, _2, _3)}); 216 | msg_handler_map_.insert({ADD_FRIEND_MSG, bind(&ChatService::add_friend, this, _1, _2, _3)}); 217 | msg_handler_map_.insert({CREATE_GROUP_MSG, bind(&ChatService::create_group, this, _1, _2, _3)}); 218 | msg_handler_map_.insert({ADD_GROUP_MSG, bind(&ChatService::add_group, this, _1, _2, _3)}); 219 | msg_handler_map_.insert({GROUP_CHAT_MSG, bind(&ChatService::group_chat, this, _1, _2, _3)}); 220 | ``` 221 | 222 | 这样我们就得到了一个存储消息类型和处理这个消息的方法的容器。 223 | 224 | 这样,我们在网络层就可以根据消息类型来获得并执行其handler 225 | 226 | ```cpp 227 | //解耦网络和业务模块的代码 228 | //通过js里面的msgid,绑定msgid的回调函数,获取业务处理器handler 229 | auto msg_handler = ChatService::instance()->get_handler(js["msgid"].get()); 230 | 231 | msg_handler(conn, js, time); 232 | ``` 233 | ## 业务模块 234 | 由于与网络模块的解耦,在业务模块我们就不用去关系网络上所发生的事情,专注业务便可。 235 | 236 | 具体业务相关的数据结构如下: 237 | 238 | ```cpp 239 | //存储在线用户的连接情况,便于服务器给用户发消息,注意线程安全 240 | unordered_map user_connection_map_; 241 | 242 | mutex conn_mutex_; 243 | 244 | UserModel user_model_; 245 | OfflineMessageModel offline_message_model_; 246 | FriendModel friend_model_; 247 | GroupModel group_model_; 248 | ``` 249 | 250 | ### 注册业务 251 | 当服务器接收到 json 字符串的时候,对其进行反序列化,得到要注册的信息,然后写入到User表中,成功就将id号返回,失败就把errno字段设置为1。 252 | 253 | ### 登录业务 254 | 当服务器接收到 json 字符串的时候,对其进行反序列化,得到用户传递过来的账号和密码信息。 255 | 256 | 首先就是检测这个账号和密码是否与服务器中的数据匹配,如果不匹配就把errno设置为1并返回 id or password error的错误信息。 257 | 258 | 如果匹配,就检测当前用户是否在线,因为有在别的设备登录的状况,如果在线就把errno设置为2,返回 id is online的错误信息 259 | 260 | 如果用户不在线,这个时候用户就是**登陆成功**了,这个时候服务器就把该用户的**好友列表,群组列表**以及**离线消息**都推送给该用户。 261 | 262 | ### 加好友业务 263 | 这个业务很简单,服务器得到反序列化的信息,然后将这个信息写入Friend表中即可。 264 | 265 | ### 一对一聊天业务 266 | 服务器接收到客户端的信息,然后去本服务器的`user_connection_map_`接受信息的用户是否在本服务器在线,在线的话直接转发即可,不在线的话,看看数据库里面的信息是否是在线,如果在线,那么就是接收用户在其他服务器登录,将消息通过redis中间件转发即可。 267 | 268 | 如果均不在线,转储离线消息即可。 269 | 270 | ### 创建群业务 271 | 服务器接收到客户端的信息,把群组的信息写入到AllGroup表中,并将创建者的信息写入到GroupUser中,设置创建者为creator 272 | 273 | ### 加入群业务 274 | 服务器接收到客户端的信息,将用户数据写入到GroupUser表中,并将role角色设置为normal。 275 | 276 | ### 群聊业务 277 | 服务器接收到客户端的信息,先去GroupUser查询到所有群员的id,然后一个个去本服务器的`user_connection_map_`接受信息的用户是否在本服务器在线,在线的话直接转发即可,不在线的话,看看数据库里面的信息是否是在线,如果在线,那么就是接收用户在其他服务器登录,将消息通过redis中间件转发即可。 278 | 279 | 如果均不在线,转储离线消息即可。 280 | 281 | ### 注销业务 282 | 服务器收到客户端发来的信息,将该用户在User表中所对应的state改为offline。 283 | 284 | # 服务器集群 285 | 一般来说,一台服务器只能支持1~2w的并发量,但是这是远远不够的,我们需要更高的并发量支持,这个时候就需要引入Nginx tcp长连接负载均衡算法。 286 | 287 | 当一个新的客户端连接到来时,负载均衡模块便会根据我们在nginx.conf里面设置的参数来分配服务器资源。 288 | 289 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127200450432.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZW5taW5neHVlSVQ=,size_16,color_FFFFFF,t_70) 290 | 291 | 按图中所示,客户端只用连接我们的负载均衡服务器,然后服务器就会自动把client连接分配到对应的server服务器。 292 | 293 | # 跨服务器通信 294 | 如果我一个在server1的用户想要给在server2的用户发送消息要怎么办呢? 295 | 296 | 是像下面这样把每个服务器连接起来么? 297 | 298 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127201004249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZW5taW5neHVlSVQ=,size_16,color_FFFFFF,t_70) 299 | 这样肯定不行,服务器之间关联性太强了,一旦多加一个服务器,以前的服务器都要增加一条指向它的连接。 300 | 301 | 所以,我们可以借鉴交换机连接PC的思想,引入Redis消息队列中间件! 302 | 303 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127201649999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoZW5taW5neHVlSVQ=,size_16,color_FFFFFF,t_70) 304 | 305 | 当客户端登录的时候,服务器吧它的id号 subscribe到redis中间件,表示该服务器对这个id发生的事件感兴趣,而Redis收到发送给该id的消息时就会 把消息转发到这个服务器上。 306 | 307 | # 集群聊天服务器的思考 308 | 服务器设计上还是存在一些问题的: 309 | 310 | - 如果服务器宕机,正在连接该服务的用户数据怎么办? 311 | - 服务器缺少一个文件服务器来提供数据模块所需的信息 312 | - 服务器和文件服务器是直接连接查询还是服务器存储一部分信息然后隔段时间同步一下 313 | - 加好友的时候应该像QQ那样发送请求,然后等待对方接受再写入 314 | 315 | # 参考文献 316 | [1] 施磊.集群聊天服务器.图论科技.2020.7. 317 | -------------------------------------------------------------------------------- /Service/src/server/ChatService.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "ChatService.hpp" 6 | #include "public.hpp" 7 | 8 | using namespace muduo; 9 | using namespace std; 10 | 11 | //获取单例对象 12 | ChatService *ChatService::instance() 13 | { 14 | static ChatService service; 15 | return &service; 16 | } 17 | 18 | //注册消息以及对应的回调操作 19 | ChatService::ChatService() 20 | { 21 | msg_handler_map_.insert({LOGIN_MSG, bind(&ChatService::login, this, _1, _2, _3)}); 22 | msg_handler_map_.insert({LOGINOUT_MSG, bind(&ChatService::loginout, this, _1, _2, _3)}); 23 | msg_handler_map_.insert({REG_MSG, bind(&ChatService::regist, this, _1, _2, _3)}); 24 | msg_handler_map_.insert({ONE_CHAT_MSG, bind(&ChatService::one_chat, this, _1, _2, _3)}); 25 | msg_handler_map_.insert({ADD_FRIEND_MSG, bind(&ChatService::add_friend, this, _1, _2, _3)}); 26 | msg_handler_map_.insert({CREATE_GROUP_MSG, bind(&ChatService::create_group, this, _1, _2, _3)}); 27 | msg_handler_map_.insert({ADD_GROUP_MSG, bind(&ChatService::add_group, this, _1, _2, _3)}); 28 | msg_handler_map_.insert({GROUP_CHAT_MSG, bind(&ChatService::group_chat, this, _1, _2, _3)}); 29 | 30 | if (redis_.connect()) 31 | { 32 | redis_.init_notify_handler(bind(&ChatService::redis_subscribe_message_handler, this, _1, _2)); 33 | } 34 | } 35 | 36 | //获取消息对应的处理器 37 | MsgHandler ChatService::get_handler(int msgid) 38 | { 39 | //记录错误日志,msgid没有对应的事件处理回调 40 | auto it = msg_handler_map_.find(msgid); 41 | //如果没有对应的msgid 42 | if (it == msg_handler_map_.end()) 43 | { 44 | //返回一个默认处理器,打印错误日志 45 | return [=](const TcpConnectionPtr &conn, json &js, Timestamp time) { 46 | LOG_ERROR << "msgid: " << msgid << " can not find handler!"; 47 | }; 48 | } 49 | else 50 | { 51 | return msg_handler_map_[msgid]; 52 | } 53 | } 54 | 55 | //登录 56 | void ChatService::login(const TcpConnectionPtr &conn, json &js, Timestamp time) 57 | { 58 | int id = js["id"].get(); 59 | string password = js["password"]; 60 | 61 | User user = user_model_.query(id); 62 | //cout << "js:" << js << endl; 63 | 64 | if (user.get_id() == id && user.get_password() == password) 65 | { 66 | //用户在线 67 | if (user.get_state() == "online") 68 | { 69 | //用户不存在 70 | json response; 71 | response["msgid"] = LOGIN_MSG_ACK; 72 | response["errno"] = 2; 73 | response["errmsg"] = "id is online"; 74 | 75 | conn->send(response.dump()); 76 | } 77 | else 78 | { 79 | //登陆成功 80 | { 81 | //记录用户连接信息,注意线程安全 82 | lock_guard lock(conn_mutex_); 83 | user_connection_map_.insert({id, conn}); 84 | } 85 | 86 | //订阅Redis 87 | redis_.subscribe(id); 88 | 89 | //更新用户状态信息 90 | user.set_state("online"); 91 | user_model_.update_state(user); 92 | 93 | json response; 94 | response["msgid"] = LOGIN_MSG_ACK; 95 | response["errno"] = 0; 96 | response["id"] = user.get_id(); 97 | response["name"] = user.get_name(); 98 | 99 | //查询用户是否有离线消息 100 | vector vec = offline_message_model_.query(id); 101 | //增加离线消息 102 | if (!vec.empty()) 103 | { 104 | response["offlinemsg"] = vec; 105 | //读取完后删除消息 106 | offline_message_model_.remove(id); 107 | } 108 | 109 | //查询该用户的好友信息并返回 110 | vector user_vec = friend_model_.query(id); 111 | if (!user_vec.empty()) 112 | { 113 | vector friend_vec; 114 | for (User &user : user_vec) 115 | { 116 | json js; 117 | js["id"] = user.get_id(); 118 | js["name"] = user.get_name(); 119 | js["state"] = user.get_state(); 120 | friend_vec.push_back(js.dump()); 121 | } 122 | response["friends"] = friend_vec; 123 | } 124 | 125 | //查询该用户的群组信息并返回 126 | vector group_vec = group_model_.query_group(id); 127 | if (!group_vec.empty()) 128 | { 129 | // group:[{groupid:[xxx, xxx, xxx, xxx]}] 130 | vector groupV; 131 | for (Group &group : group_vec) 132 | { 133 | json grpjson; 134 | grpjson["id"] = group.get_id(); 135 | grpjson["groupname"] = group.get_name(); 136 | grpjson["groupdesc"] = group.get_desc(); 137 | 138 | vector userV; 139 | for (GroupUser &user : group.get_User()) 140 | { 141 | json js; 142 | js["id"] = user.get_id(); 143 | js["name"] = user.get_name(); 144 | js["state"] = user.get_state(); 145 | js["role"] = user.get_role(); 146 | userV.push_back(js.dump()); 147 | } 148 | grpjson["users"] = userV; 149 | 150 | groupV.push_back(grpjson.dump()); 151 | } 152 | 153 | response["groups"] = groupV; 154 | } 155 | 156 | conn->send(response.dump()); 157 | } 158 | } 159 | else 160 | { 161 | //用户不存在或密码错误 162 | json response; 163 | response["msgid"] = LOGIN_MSG_ACK; 164 | response["errno"] = 1; 165 | response["errmsg"] = "id or password error"; 166 | 167 | conn->send(response.dump()); 168 | } 169 | } 170 | 171 | //注册 172 | void ChatService::regist(const TcpConnectionPtr &conn, json &js, Timestamp time) 173 | { 174 | string name = js["name"]; 175 | string password = js["password"]; 176 | 177 | User user; 178 | user.set_name(name); 179 | user.set_password(password); 180 | 181 | bool state = user_model_.insert(user); 182 | if (state) 183 | { 184 | //注册成功 185 | json response; 186 | response["msgid"] = REG_MSG_ACK; 187 | response["errno"] = 0; 188 | response["id"] = user.get_id(); 189 | 190 | conn->send(response.dump()); 191 | } 192 | else 193 | { 194 | //注册失败 195 | json response; 196 | response["msgid"] = REG_MSG_ACK; 197 | response["errno"] = 1; 198 | 199 | conn->send(response.dump()); 200 | } 201 | } 202 | 203 | //处理客户端异常退出 204 | void ChatService::client_close_exception(const TcpConnectionPtr &conn) 205 | { 206 | //1.删除user_map 2.用户改为offline 3.线程安全 207 | User user; 208 | { 209 | lock_guard lock(conn_mutex_); 210 | for (auto it = user_connection_map_.begin(); it != user_connection_map_.end(); it++) 211 | { 212 | if (it->second == conn) 213 | { 214 | user.set_id(it->first); 215 | user_connection_map_.erase(it); 216 | break; 217 | } 218 | } 219 | } 220 | 221 | //取消订阅 222 | redis_.unsubscribe(user.get_id()); 223 | 224 | if (user.get_id() != -1) 225 | { 226 | user.set_state("offline"); 227 | user_model_.update_state(user); 228 | } 229 | } 230 | 231 | //一对一聊天业务 232 | void ChatService::one_chat(const TcpConnectionPtr &conn, json &js, Timestamp time) 233 | { 234 | int receive_id = js["to"].get(); 235 | 236 | { 237 | lock_guard lock(conn_mutex_); 238 | auto it = user_connection_map_.find(receive_id); 239 | if (it != user_connection_map_.end()) 240 | { 241 | //用户在线,转发消息给receive用户 242 | it->second->send(js.dump()); 243 | return; 244 | } 245 | } 246 | 247 | //用户在其他主机,publish消息到redis 248 | User user = user_model_.query(receive_id); 249 | if (user.get_state() == "online") 250 | { 251 | redis_.publish(receive_id, js.dump()); 252 | return; 253 | } 254 | 255 | // 用户不在线,存储离线消息 256 | offline_message_model_.insert(receive_id, js.dump()); 257 | } 258 | 259 | //添加好友业务 260 | bool ChatService::add_friend(const TcpConnectionPtr &conn, json &js, Timestamp time) 261 | { 262 | int user_id = js["id"].get(); 263 | int friend_id = js["friendid"].get(); 264 | 265 | //存储好友信息 266 | friend_model_.insert(user_id, friend_id); 267 | } 268 | 269 | //创建 群组 270 | bool ChatService::create_group(const TcpConnectionPtr &conn, json &js, Timestamp time) 271 | { 272 | int user_id = js["id"].get(); 273 | string name = js["groupname"]; 274 | string desc = js["groupdesc"]; 275 | 276 | //创建群组信息 277 | Group group(-1, name, desc); 278 | if (group_model_.create_group(group)) 279 | { 280 | //存储群主信息 281 | if (group_model_.add_group(user_id, group.get_id(), "creator")) 282 | { 283 | return true; 284 | } 285 | } 286 | return false; 287 | } 288 | 289 | //加入群组 290 | bool ChatService::add_group(const TcpConnectionPtr &conn, json &js, Timestamp time) 291 | { 292 | int user_id = js["id"].get(); 293 | int group_id = js["groupid"].get(); 294 | if (group_model_.add_group(user_id, group_id, "normal")) 295 | { 296 | return true; 297 | } 298 | return false; 299 | } 300 | 301 | //群聊业务 302 | void ChatService::group_chat(const TcpConnectionPtr &conn, json &js, Timestamp time) 303 | { 304 | int user_id = js["id"].get(); 305 | int group_id = js["groupid"].get(); 306 | 307 | vector userid_vec = group_model_.query_group_users(user_id, group_id); 308 | 309 | lock_guard lock(conn_mutex_); 310 | for (int id : userid_vec) 311 | { 312 | auto it = user_connection_map_.find(id); 313 | if (it != user_connection_map_.end()) 314 | { 315 | //转发群消息 316 | it->second->send(js.dump()); 317 | } 318 | else 319 | { 320 | //用户在其他服务器登录 321 | User user = user_model_.query(id); 322 | if (user.get_state() == "online") 323 | { 324 | redis_.publish(id, js.dump()); 325 | } 326 | else 327 | { 328 | //转储离线消息 329 | offline_message_model_.insert(id, js.dump()); 330 | } 331 | } 332 | } 333 | } 334 | 335 | //服务器异常,业务重置 336 | void ChatService::reset() 337 | { 338 | //把online用户设置为offline 339 | user_model_.reset_state(); 340 | } 341 | 342 | //注销业务 343 | void ChatService::loginout(const TcpConnectionPtr &conn, json &js, Timestamp time) 344 | { 345 | int user_id = js["id"].get(); 346 | 347 | { 348 | lock_guard lock(conn_mutex_); 349 | auto it = user_connection_map_.find(user_id); 350 | if (it != user_connection_map_.end()) 351 | { 352 | user_connection_map_.erase(it); 353 | } 354 | } 355 | 356 | //取消Redis订阅 357 | redis_.unsubscribe(user_id); 358 | 359 | // 更新用户的状态信息 360 | User user(user_id, "", "", "offline"); 361 | user_model_.update_state(user); 362 | } 363 | 364 | //redis订阅消息触发的回调函数,这里channel其实就是id 365 | void ChatService::redis_subscribe_message_handler(int channel, string message) 366 | { 367 | //用户在线 368 | lock_guard lock(conn_mutex_); 369 | auto it = user_connection_map_.find(channel); 370 | if (it != user_connection_map_.end()) 371 | { 372 | it->second->send(message); 373 | return; 374 | } 375 | 376 | //转储离线 377 | offline_message_model_.insert(channel, message); 378 | } 379 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/feature_tests.cxx: -------------------------------------------------------------------------------- 1 | 2 | const char features[] = {"\n" 3 | "CXX_FEATURE:" 4 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L 5 | "1" 6 | #else 7 | "0" 8 | #endif 9 | "cxx_aggregate_default_initializers\n" 10 | "CXX_FEATURE:" 11 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 12 | "1" 13 | #else 14 | "0" 15 | #endif 16 | "cxx_alias_templates\n" 17 | "CXX_FEATURE:" 18 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L 19 | "1" 20 | #else 21 | "0" 22 | #endif 23 | "cxx_alignas\n" 24 | "CXX_FEATURE:" 25 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L 26 | "1" 27 | #else 28 | "0" 29 | #endif 30 | "cxx_alignof\n" 31 | "CXX_FEATURE:" 32 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L 33 | "1" 34 | #else 35 | "0" 36 | #endif 37 | "cxx_attributes\n" 38 | "CXX_FEATURE:" 39 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 40 | "1" 41 | #else 42 | "0" 43 | #endif 44 | "cxx_attribute_deprecated\n" 45 | "CXX_FEATURE:" 46 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 47 | "1" 48 | #else 49 | "0" 50 | #endif 51 | "cxx_auto_type\n" 52 | "CXX_FEATURE:" 53 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 54 | "1" 55 | #else 56 | "0" 57 | #endif 58 | "cxx_binary_literals\n" 59 | "CXX_FEATURE:" 60 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 61 | "1" 62 | #else 63 | "0" 64 | #endif 65 | "cxx_constexpr\n" 66 | "CXX_FEATURE:" 67 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 68 | "1" 69 | #else 70 | "0" 71 | #endif 72 | "cxx_contextual_conversions\n" 73 | "CXX_FEATURE:" 74 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 75 | "1" 76 | #else 77 | "0" 78 | #endif 79 | "cxx_decltype\n" 80 | "CXX_FEATURE:" 81 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 82 | "1" 83 | #else 84 | "0" 85 | #endif 86 | "cxx_decltype_auto\n" 87 | "CXX_FEATURE:" 88 | #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L 89 | "1" 90 | #else 91 | "0" 92 | #endif 93 | "cxx_decltype_incomplete_return_types\n" 94 | "CXX_FEATURE:" 95 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 96 | "1" 97 | #else 98 | "0" 99 | #endif 100 | "cxx_default_function_template_args\n" 101 | "CXX_FEATURE:" 102 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 103 | "1" 104 | #else 105 | "0" 106 | #endif 107 | "cxx_defaulted_functions\n" 108 | "CXX_FEATURE:" 109 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 110 | "1" 111 | #else 112 | "0" 113 | #endif 114 | "cxx_defaulted_move_initializers\n" 115 | "CXX_FEATURE:" 116 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 117 | "1" 118 | #else 119 | "0" 120 | #endif 121 | "cxx_delegating_constructors\n" 122 | "CXX_FEATURE:" 123 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 124 | "1" 125 | #else 126 | "0" 127 | #endif 128 | "cxx_deleted_functions\n" 129 | "CXX_FEATURE:" 130 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 131 | "1" 132 | #else 133 | "0" 134 | #endif 135 | "cxx_digit_separators\n" 136 | "CXX_FEATURE:" 137 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 138 | "1" 139 | #else 140 | "0" 141 | #endif 142 | "cxx_enum_forward_declarations\n" 143 | "CXX_FEATURE:" 144 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 145 | "1" 146 | #else 147 | "0" 148 | #endif 149 | "cxx_explicit_conversions\n" 150 | "CXX_FEATURE:" 151 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 152 | "1" 153 | #else 154 | "0" 155 | #endif 156 | "cxx_extended_friend_declarations\n" 157 | "CXX_FEATURE:" 158 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 159 | "1" 160 | #else 161 | "0" 162 | #endif 163 | "cxx_extern_templates\n" 164 | "CXX_FEATURE:" 165 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 166 | "1" 167 | #else 168 | "0" 169 | #endif 170 | "cxx_final\n" 171 | "CXX_FEATURE:" 172 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 173 | "1" 174 | #else 175 | "0" 176 | #endif 177 | "cxx_func_identifier\n" 178 | "CXX_FEATURE:" 179 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 180 | "1" 181 | #else 182 | "0" 183 | #endif 184 | "cxx_generalized_initializers\n" 185 | "CXX_FEATURE:" 186 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 187 | "1" 188 | #else 189 | "0" 190 | #endif 191 | "cxx_generic_lambdas\n" 192 | "CXX_FEATURE:" 193 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L 194 | "1" 195 | #else 196 | "0" 197 | #endif 198 | "cxx_inheriting_constructors\n" 199 | "CXX_FEATURE:" 200 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 201 | "1" 202 | #else 203 | "0" 204 | #endif 205 | "cxx_inline_namespaces\n" 206 | "CXX_FEATURE:" 207 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 208 | "1" 209 | #else 210 | "0" 211 | #endif 212 | "cxx_lambdas\n" 213 | "CXX_FEATURE:" 214 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 215 | "1" 216 | #else 217 | "0" 218 | #endif 219 | "cxx_lambda_init_captures\n" 220 | "CXX_FEATURE:" 221 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 222 | "1" 223 | #else 224 | "0" 225 | #endif 226 | "cxx_local_type_template_args\n" 227 | "CXX_FEATURE:" 228 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 229 | "1" 230 | #else 231 | "0" 232 | #endif 233 | "cxx_long_long_type\n" 234 | "CXX_FEATURE:" 235 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 236 | "1" 237 | #else 238 | "0" 239 | #endif 240 | "cxx_noexcept\n" 241 | "CXX_FEATURE:" 242 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 243 | "1" 244 | #else 245 | "0" 246 | #endif 247 | "cxx_nonstatic_member_init\n" 248 | "CXX_FEATURE:" 249 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 250 | "1" 251 | #else 252 | "0" 253 | #endif 254 | "cxx_nullptr\n" 255 | "CXX_FEATURE:" 256 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 257 | "1" 258 | #else 259 | "0" 260 | #endif 261 | "cxx_override\n" 262 | "CXX_FEATURE:" 263 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 264 | "1" 265 | #else 266 | "0" 267 | #endif 268 | "cxx_range_for\n" 269 | "CXX_FEATURE:" 270 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 271 | "1" 272 | #else 273 | "0" 274 | #endif 275 | "cxx_raw_string_literals\n" 276 | "CXX_FEATURE:" 277 | #if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L 278 | "1" 279 | #else 280 | "0" 281 | #endif 282 | "cxx_reference_qualified_functions\n" 283 | "CXX_FEATURE:" 284 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L 285 | "1" 286 | #else 287 | "0" 288 | #endif 289 | "cxx_relaxed_constexpr\n" 290 | "CXX_FEATURE:" 291 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L 292 | "1" 293 | #else 294 | "0" 295 | #endif 296 | "cxx_return_type_deduction\n" 297 | "CXX_FEATURE:" 298 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 299 | "1" 300 | #else 301 | "0" 302 | #endif 303 | "cxx_right_angle_brackets\n" 304 | "CXX_FEATURE:" 305 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 306 | "1" 307 | #else 308 | "0" 309 | #endif 310 | "cxx_rvalue_references\n" 311 | "CXX_FEATURE:" 312 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 313 | "1" 314 | #else 315 | "0" 316 | #endif 317 | "cxx_sizeof_member\n" 318 | "CXX_FEATURE:" 319 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 320 | "1" 321 | #else 322 | "0" 323 | #endif 324 | "cxx_static_assert\n" 325 | "CXX_FEATURE:" 326 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 327 | "1" 328 | #else 329 | "0" 330 | #endif 331 | "cxx_strong_enums\n" 332 | "CXX_FEATURE:" 333 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus 334 | "1" 335 | #else 336 | "0" 337 | #endif 338 | "cxx_template_template_parameters\n" 339 | "CXX_FEATURE:" 340 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L 341 | "1" 342 | #else 343 | "0" 344 | #endif 345 | "cxx_thread_local\n" 346 | "CXX_FEATURE:" 347 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 348 | "1" 349 | #else 350 | "0" 351 | #endif 352 | "cxx_trailing_return_types\n" 353 | "CXX_FEATURE:" 354 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 355 | "1" 356 | #else 357 | "0" 358 | #endif 359 | "cxx_unicode_literals\n" 360 | "CXX_FEATURE:" 361 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 362 | "1" 363 | #else 364 | "0" 365 | #endif 366 | "cxx_uniform_initialization\n" 367 | "CXX_FEATURE:" 368 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 369 | "1" 370 | #else 371 | "0" 372 | #endif 373 | "cxx_unrestricted_unions\n" 374 | "CXX_FEATURE:" 375 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L 376 | "1" 377 | #else 378 | "0" 379 | #endif 380 | "cxx_user_literals\n" 381 | "CXX_FEATURE:" 382 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L 383 | "1" 384 | #else 385 | "0" 386 | #endif 387 | "cxx_variable_templates\n" 388 | "CXX_FEATURE:" 389 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 390 | "1" 391 | #else 392 | "0" 393 | #endif 394 | "cxx_variadic_macros\n" 395 | "CXX_FEATURE:" 396 | #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) 397 | "1" 398 | #else 399 | "0" 400 | #endif 401 | "cxx_variadic_templates\n" 402 | 403 | }; 404 | 405 | int main(int argc, char** argv) { (void)argv; return features[argc]; } 406 | -------------------------------------------------------------------------------- /Service/build/CMakeCache.txt: -------------------------------------------------------------------------------- 1 | # This is the CMakeCache file. 2 | # For build in directory: /home/ik/桌面/Service/build 3 | # It was generated by CMake: /usr/bin/cmake 4 | # You can edit this file to change values found and used by cmake. 5 | # If you do not want to change any of the values, simply exit the editor. 6 | # If you do want to change a value, simply edit, save, and exit the editor. 7 | # The syntax for the file is as follows: 8 | # KEY:TYPE=VALUE 9 | # KEY is the name of a variable in the cache. 10 | # TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. 11 | # VALUE is the current value for the KEY. 12 | 13 | ######################## 14 | # EXTERNAL cache entries 15 | ######################## 16 | 17 | //Path to a program. 18 | CMAKE_AR:FILEPATH=/usr/bin/ar 19 | 20 | //No help, variable specified on the command line. 21 | CMAKE_BUILD_TYPE:STRING=Debug 22 | 23 | //Enable/Disable color output during build. 24 | CMAKE_COLOR_MAKEFILE:BOOL=ON 25 | 26 | //No help, variable specified on the command line. 27 | CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-7 28 | 29 | //A wrapper around 'ar' adding the appropriate '--plugin' option 30 | // for the GCC compiler 31 | CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 32 | 33 | //A wrapper around 'ranlib' adding the appropriate '--plugin' option 34 | // for the GCC compiler 35 | CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 36 | 37 | //Flags used by the compiler during all build types. 38 | CMAKE_CXX_FLAGS:STRING= 39 | 40 | //Flags used by the compiler during debug builds. 41 | CMAKE_CXX_FLAGS_DEBUG:STRING=-g 42 | 43 | //Flags used by the compiler during release builds for minimum 44 | // size. 45 | CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG 46 | 47 | //Flags used by the compiler during release builds. 48 | CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG 49 | 50 | //Flags used by the compiler during release builds with debug info. 51 | CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG 52 | 53 | //No help, variable specified on the command line. 54 | CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc-7 55 | 56 | //A wrapper around 'ar' adding the appropriate '--plugin' option 57 | // for the GCC compiler 58 | CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 59 | 60 | //A wrapper around 'ranlib' adding the appropriate '--plugin' option 61 | // for the GCC compiler 62 | CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 63 | 64 | //Flags used by the compiler during all build types. 65 | CMAKE_C_FLAGS:STRING= 66 | 67 | //Flags used by the compiler during debug builds. 68 | CMAKE_C_FLAGS_DEBUG:STRING=-g 69 | 70 | //Flags used by the compiler during release builds for minimum 71 | // size. 72 | CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG 73 | 74 | //Flags used by the compiler during release builds. 75 | CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG 76 | 77 | //Flags used by the compiler during release builds with debug info. 78 | CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG 79 | 80 | //Flags used by the linker. 81 | CMAKE_EXE_LINKER_FLAGS:STRING= 82 | 83 | //Flags used by the linker during debug builds. 84 | CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= 85 | 86 | //Flags used by the linker during release minsize builds. 87 | CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= 88 | 89 | //Flags used by the linker during release builds. 90 | CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= 91 | 92 | //Flags used by the linker during Release with Debug Info builds. 93 | CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= 94 | 95 | //No help, variable specified on the command line. 96 | CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE 97 | 98 | //Install path prefix, prepended onto install directories. 99 | CMAKE_INSTALL_PREFIX:PATH=/usr/local 100 | 101 | //Path to a program. 102 | CMAKE_LINKER:FILEPATH=/usr/bin/ld 103 | 104 | //Path to a program. 105 | CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make 106 | 107 | //Flags used by the linker during the creation of modules. 108 | CMAKE_MODULE_LINKER_FLAGS:STRING= 109 | 110 | //Flags used by the linker during debug builds. 111 | CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= 112 | 113 | //Flags used by the linker during release minsize builds. 114 | CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= 115 | 116 | //Flags used by the linker during release builds. 117 | CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= 118 | 119 | //Flags used by the linker during Release with Debug Info builds. 120 | CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= 121 | 122 | //Path to a program. 123 | CMAKE_NM:FILEPATH=/usr/bin/nm 124 | 125 | //Path to a program. 126 | CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy 127 | 128 | //Path to a program. 129 | CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump 130 | 131 | //Value Computed by CMake 132 | CMAKE_PROJECT_NAME:STATIC=chat 133 | 134 | //Path to a program. 135 | CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib 136 | 137 | //Flags used by the linker during the creation of dll's. 138 | CMAKE_SHARED_LINKER_FLAGS:STRING= 139 | 140 | //Flags used by the linker during debug builds. 141 | CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= 142 | 143 | //Flags used by the linker during release minsize builds. 144 | CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= 145 | 146 | //Flags used by the linker during release builds. 147 | CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= 148 | 149 | //Flags used by the linker during Release with Debug Info builds. 150 | CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= 151 | 152 | //If set, runtime paths are not added when installing shared libraries, 153 | // but are added when building. 154 | CMAKE_SKIP_INSTALL_RPATH:BOOL=NO 155 | 156 | //If set, runtime paths are not added when using shared libraries. 157 | CMAKE_SKIP_RPATH:BOOL=NO 158 | 159 | //Flags used by the linker during the creation of static libraries. 160 | CMAKE_STATIC_LINKER_FLAGS:STRING= 161 | 162 | //Flags used by the linker during debug builds. 163 | CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= 164 | 165 | //Flags used by the linker during release minsize builds. 166 | CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= 167 | 168 | //Flags used by the linker during release builds. 169 | CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= 170 | 171 | //Flags used by the linker during Release with Debug Info builds. 172 | CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= 173 | 174 | //Path to a program. 175 | CMAKE_STRIP:FILEPATH=/usr/bin/strip 176 | 177 | //If this value is on, makefiles will be generated without the 178 | // .SILENT directive, and all commands will be echoed to the console 179 | // during the make. This is useful for debugging only. With Visual 180 | // Studio IDE projects all commands are done without /nologo. 181 | CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE 182 | 183 | //Value Computed by CMake 184 | chat_BINARY_DIR:STATIC=/home/ik/桌面/Service/build 185 | 186 | //Value Computed by CMake 187 | chat_SOURCE_DIR:STATIC=/home/ik/桌面/Service 188 | 189 | 190 | ######################## 191 | # INTERNAL cache entries 192 | ######################## 193 | 194 | //ADVANCED property for variable: CMAKE_AR 195 | CMAKE_AR-ADVANCED:INTERNAL=1 196 | //This is the directory where this CMakeCache.txt was created 197 | CMAKE_CACHEFILE_DIR:INTERNAL=/home/ik/桌面/Service/build 198 | //Major version of cmake used to create the current loaded cache 199 | CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 200 | //Minor version of cmake used to create the current loaded cache 201 | CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 202 | //Patch version of cmake used to create the current loaded cache 203 | CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 204 | //ADVANCED property for variable: CMAKE_COLOR_MAKEFILE 205 | CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 206 | //Path to CMake executable. 207 | CMAKE_COMMAND:INTERNAL=/usr/bin/cmake 208 | //Path to cpack program executable. 209 | CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack 210 | //Path to ctest program executable. 211 | CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest 212 | //ADVANCED property for variable: CMAKE_CXX_COMPILER 213 | CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 214 | //ADVANCED property for variable: CMAKE_CXX_COMPILER_AR 215 | CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 216 | //ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB 217 | CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 218 | //ADVANCED property for variable: CMAKE_CXX_FLAGS 219 | CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 220 | //ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG 221 | CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 222 | //ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL 223 | CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 224 | //ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE 225 | CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 226 | //ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO 227 | CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 228 | //ADVANCED property for variable: CMAKE_C_COMPILER 229 | CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 230 | //ADVANCED property for variable: CMAKE_C_COMPILER_AR 231 | CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 232 | //ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB 233 | CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 234 | //ADVANCED property for variable: CMAKE_C_FLAGS 235 | CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 236 | //ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG 237 | CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 238 | //ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL 239 | CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 240 | //ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE 241 | CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 242 | //ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO 243 | CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 244 | //Executable file format 245 | CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF 246 | //ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS 247 | CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 248 | //ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG 249 | CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 250 | //ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL 251 | CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 252 | //ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE 253 | CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 254 | //ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO 255 | CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 256 | //ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS 257 | CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 258 | //Name of external makefile project generator. 259 | CMAKE_EXTRA_GENERATOR:INTERNAL= 260 | //Name of generator. 261 | CMAKE_GENERATOR:INTERNAL=Unix Makefiles 262 | //Name of generator platform. 263 | CMAKE_GENERATOR_PLATFORM:INTERNAL= 264 | //Name of generator toolset. 265 | CMAKE_GENERATOR_TOOLSET:INTERNAL= 266 | //Source directory with the top level CMakeLists.txt file for this 267 | // project 268 | CMAKE_HOME_DIRECTORY:INTERNAL=/home/ik/桌面/Service 269 | //Install .so files without execute permission. 270 | CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 271 | //ADVANCED property for variable: CMAKE_LINKER 272 | CMAKE_LINKER-ADVANCED:INTERNAL=1 273 | //ADVANCED property for variable: CMAKE_MAKE_PROGRAM 274 | CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 275 | //ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS 276 | CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 277 | //ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG 278 | CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 279 | //ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL 280 | CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 281 | //ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE 282 | CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 283 | //ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO 284 | CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 285 | //ADVANCED property for variable: CMAKE_NM 286 | CMAKE_NM-ADVANCED:INTERNAL=1 287 | //number of local generators 288 | CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=4 289 | //ADVANCED property for variable: CMAKE_OBJCOPY 290 | CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 291 | //ADVANCED property for variable: CMAKE_OBJDUMP 292 | CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 293 | //Platform information initialized 294 | CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 295 | //ADVANCED property for variable: CMAKE_RANLIB 296 | CMAKE_RANLIB-ADVANCED:INTERNAL=1 297 | //Path to CMake installation. 298 | CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.10 299 | //ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS 300 | CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 301 | //ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG 302 | CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 303 | //ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL 304 | CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 305 | //ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE 306 | CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 307 | //ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO 308 | CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 309 | //ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH 310 | CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 311 | //ADVANCED property for variable: CMAKE_SKIP_RPATH 312 | CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 313 | //ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS 314 | CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 315 | //ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG 316 | CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 317 | //ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL 318 | CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 319 | //ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE 320 | CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 321 | //ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO 322 | CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 323 | //ADVANCED property for variable: CMAKE_STRIP 324 | CMAKE_STRIP-ADVANCED:INTERNAL=1 325 | //uname command 326 | CMAKE_UNAME:INTERNAL=/bin/uname 327 | //ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE 328 | CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 329 | 330 | -------------------------------------------------------------------------------- /Service/build/src/server/Makefile: -------------------------------------------------------------------------------- 1 | # CMAKE generated file: DO NOT EDIT! 2 | # Generated by "Unix Makefiles" Generator, CMake Version 3.10 3 | 4 | # Default target executed when no arguments are given to make. 5 | default_target: all 6 | 7 | .PHONY : default_target 8 | 9 | # Allow only one "make -f Makefile2" at a time, but pass parallelism. 10 | .NOTPARALLEL: 11 | 12 | 13 | #============================================================================= 14 | # Special targets provided by cmake. 15 | 16 | # Disable implicit rules so canonical targets will work. 17 | .SUFFIXES: 18 | 19 | 20 | # Remove some rules from gmake that .SUFFIXES does not remove. 21 | SUFFIXES = 22 | 23 | .SUFFIXES: .hpux_make_needs_suffix_list 24 | 25 | 26 | # Suppress display of executed commands. 27 | $(VERBOSE).SILENT: 28 | 29 | 30 | # A target that is always out of date. 31 | cmake_force: 32 | 33 | .PHONY : cmake_force 34 | 35 | #============================================================================= 36 | # Set environment variables for the build. 37 | 38 | # The shell in which to execute make rules. 39 | SHELL = /bin/sh 40 | 41 | # The CMake executable. 42 | CMAKE_COMMAND = /usr/bin/cmake 43 | 44 | # The command to remove a file. 45 | RM = /usr/bin/cmake -E remove -f 46 | 47 | # Escaping for special characters. 48 | EQUALS = = 49 | 50 | # The top-level source directory on which CMake was run. 51 | CMAKE_SOURCE_DIR = /home/ik/桌面/Service 52 | 53 | # The top-level build directory on which CMake was run. 54 | CMAKE_BINARY_DIR = /home/ik/桌面/Service/build 55 | 56 | #============================================================================= 57 | # Targets provided globally by CMake. 58 | 59 | # Special rule for the target rebuild_cache 60 | rebuild_cache: 61 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." 62 | /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) 63 | .PHONY : rebuild_cache 64 | 65 | # Special rule for the target rebuild_cache 66 | rebuild_cache/fast: rebuild_cache 67 | 68 | .PHONY : rebuild_cache/fast 69 | 70 | # Special rule for the target edit_cache 71 | edit_cache: 72 | @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." 73 | /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. 74 | .PHONY : edit_cache 75 | 76 | # Special rule for the target edit_cache 77 | edit_cache/fast: edit_cache 78 | 79 | .PHONY : edit_cache/fast 80 | 81 | # The main all target 82 | all: cmake_check_build_system 83 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles /home/ik/桌面/Service/build/src/server/CMakeFiles/progress.marks 84 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/server/all 85 | $(CMAKE_COMMAND) -E cmake_progress_start /home/ik/桌面/Service/build/CMakeFiles 0 86 | .PHONY : all 87 | 88 | # The main clean target 89 | clean: 90 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/server/clean 91 | .PHONY : clean 92 | 93 | # The main clean target 94 | clean/fast: clean 95 | 96 | .PHONY : clean/fast 97 | 98 | # Prepare targets for installation. 99 | preinstall: all 100 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/server/preinstall 101 | .PHONY : preinstall 102 | 103 | # Prepare targets for installation. 104 | preinstall/fast: 105 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/server/preinstall 106 | .PHONY : preinstall/fast 107 | 108 | # clear depends 109 | depend: 110 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 111 | .PHONY : depend 112 | 113 | # Convenience name for target. 114 | src/server/CMakeFiles/ChatServer.dir/rule: 115 | cd /home/ik/桌面/Service/build && $(MAKE) -f CMakeFiles/Makefile2 src/server/CMakeFiles/ChatServer.dir/rule 116 | .PHONY : src/server/CMakeFiles/ChatServer.dir/rule 117 | 118 | # Convenience name for target. 119 | ChatServer: src/server/CMakeFiles/ChatServer.dir/rule 120 | 121 | .PHONY : ChatServer 122 | 123 | # fast build rule for target. 124 | ChatServer/fast: 125 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/build 126 | .PHONY : ChatServer/fast 127 | 128 | ChatServer.o: ChatServer.cpp.o 129 | 130 | .PHONY : ChatServer.o 131 | 132 | # target to build an object file 133 | ChatServer.cpp.o: 134 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.o 135 | .PHONY : ChatServer.cpp.o 136 | 137 | ChatServer.i: ChatServer.cpp.i 138 | 139 | .PHONY : ChatServer.i 140 | 141 | # target to preprocess a source file 142 | ChatServer.cpp.i: 143 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.i 144 | .PHONY : ChatServer.cpp.i 145 | 146 | ChatServer.s: ChatServer.cpp.s 147 | 148 | .PHONY : ChatServer.s 149 | 150 | # target to generate assembly for a file 151 | ChatServer.cpp.s: 152 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatServer.cpp.s 153 | .PHONY : ChatServer.cpp.s 154 | 155 | ChatService.o: ChatService.cpp.o 156 | 157 | .PHONY : ChatService.o 158 | 159 | # target to build an object file 160 | ChatService.cpp.o: 161 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.o 162 | .PHONY : ChatService.cpp.o 163 | 164 | ChatService.i: ChatService.cpp.i 165 | 166 | .PHONY : ChatService.i 167 | 168 | # target to preprocess a source file 169 | ChatService.cpp.i: 170 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.i 171 | .PHONY : ChatService.cpp.i 172 | 173 | ChatService.s: ChatService.cpp.s 174 | 175 | .PHONY : ChatService.s 176 | 177 | # target to generate assembly for a file 178 | ChatService.cpp.s: 179 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/ChatService.cpp.s 180 | .PHONY : ChatService.cpp.s 181 | 182 | main.o: main.cpp.o 183 | 184 | .PHONY : main.o 185 | 186 | # target to build an object file 187 | main.cpp.o: 188 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/main.cpp.o 189 | .PHONY : main.cpp.o 190 | 191 | main.i: main.cpp.i 192 | 193 | .PHONY : main.i 194 | 195 | # target to preprocess a source file 196 | main.cpp.i: 197 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/main.cpp.i 198 | .PHONY : main.cpp.i 199 | 200 | main.s: main.cpp.s 201 | 202 | .PHONY : main.s 203 | 204 | # target to generate assembly for a file 205 | main.cpp.s: 206 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/main.cpp.s 207 | .PHONY : main.cpp.s 208 | 209 | model/FriendModel.o: model/FriendModel.cpp.o 210 | 211 | .PHONY : model/FriendModel.o 212 | 213 | # target to build an object file 214 | model/FriendModel.cpp.o: 215 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.o 216 | .PHONY : model/FriendModel.cpp.o 217 | 218 | model/FriendModel.i: model/FriendModel.cpp.i 219 | 220 | .PHONY : model/FriendModel.i 221 | 222 | # target to preprocess a source file 223 | model/FriendModel.cpp.i: 224 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.i 225 | .PHONY : model/FriendModel.cpp.i 226 | 227 | model/FriendModel.s: model/FriendModel.cpp.s 228 | 229 | .PHONY : model/FriendModel.s 230 | 231 | # target to generate assembly for a file 232 | model/FriendModel.cpp.s: 233 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/FriendModel.cpp.s 234 | .PHONY : model/FriendModel.cpp.s 235 | 236 | model/GroupModel.o: model/GroupModel.cpp.o 237 | 238 | .PHONY : model/GroupModel.o 239 | 240 | # target to build an object file 241 | model/GroupModel.cpp.o: 242 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.o 243 | .PHONY : model/GroupModel.cpp.o 244 | 245 | model/GroupModel.i: model/GroupModel.cpp.i 246 | 247 | .PHONY : model/GroupModel.i 248 | 249 | # target to preprocess a source file 250 | model/GroupModel.cpp.i: 251 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.i 252 | .PHONY : model/GroupModel.cpp.i 253 | 254 | model/GroupModel.s: model/GroupModel.cpp.s 255 | 256 | .PHONY : model/GroupModel.s 257 | 258 | # target to generate assembly for a file 259 | model/GroupModel.cpp.s: 260 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/GroupModel.cpp.s 261 | .PHONY : model/GroupModel.cpp.s 262 | 263 | model/OfflineMessageModel.o: model/OfflineMessageModel.cpp.o 264 | 265 | .PHONY : model/OfflineMessageModel.o 266 | 267 | # target to build an object file 268 | model/OfflineMessageModel.cpp.o: 269 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.o 270 | .PHONY : model/OfflineMessageModel.cpp.o 271 | 272 | model/OfflineMessageModel.i: model/OfflineMessageModel.cpp.i 273 | 274 | .PHONY : model/OfflineMessageModel.i 275 | 276 | # target to preprocess a source file 277 | model/OfflineMessageModel.cpp.i: 278 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.i 279 | .PHONY : model/OfflineMessageModel.cpp.i 280 | 281 | model/OfflineMessageModel.s: model/OfflineMessageModel.cpp.s 282 | 283 | .PHONY : model/OfflineMessageModel.s 284 | 285 | # target to generate assembly for a file 286 | model/OfflineMessageModel.cpp.s: 287 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/OfflineMessageModel.cpp.s 288 | .PHONY : model/OfflineMessageModel.cpp.s 289 | 290 | model/UserModel.o: model/UserModel.cpp.o 291 | 292 | .PHONY : model/UserModel.o 293 | 294 | # target to build an object file 295 | model/UserModel.cpp.o: 296 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.o 297 | .PHONY : model/UserModel.cpp.o 298 | 299 | model/UserModel.i: model/UserModel.cpp.i 300 | 301 | .PHONY : model/UserModel.i 302 | 303 | # target to preprocess a source file 304 | model/UserModel.cpp.i: 305 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.i 306 | .PHONY : model/UserModel.cpp.i 307 | 308 | model/UserModel.s: model/UserModel.cpp.s 309 | 310 | .PHONY : model/UserModel.s 311 | 312 | # target to generate assembly for a file 313 | model/UserModel.cpp.s: 314 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/model/UserModel.cpp.s 315 | .PHONY : model/UserModel.cpp.s 316 | 317 | redis/Redis.o: redis/Redis.cpp.o 318 | 319 | .PHONY : redis/Redis.o 320 | 321 | # target to build an object file 322 | redis/Redis.cpp.o: 323 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.o 324 | .PHONY : redis/Redis.cpp.o 325 | 326 | redis/Redis.i: redis/Redis.cpp.i 327 | 328 | .PHONY : redis/Redis.i 329 | 330 | # target to preprocess a source file 331 | redis/Redis.cpp.i: 332 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.i 333 | .PHONY : redis/Redis.cpp.i 334 | 335 | redis/Redis.s: redis/Redis.cpp.s 336 | 337 | .PHONY : redis/Redis.s 338 | 339 | # target to generate assembly for a file 340 | redis/Redis.cpp.s: 341 | cd /home/ik/桌面/Service/build && $(MAKE) -f src/server/CMakeFiles/ChatServer.dir/build.make src/server/CMakeFiles/ChatServer.dir/redis/Redis.cpp.s 342 | .PHONY : redis/Redis.cpp.s 343 | 344 | # Help Target 345 | help: 346 | @echo "The following are some of the valid targets for this Makefile:" 347 | @echo "... all (the default if no target is provided)" 348 | @echo "... clean" 349 | @echo "... depend" 350 | @echo "... rebuild_cache" 351 | @echo "... ChatServer" 352 | @echo "... edit_cache" 353 | @echo "... ChatServer.o" 354 | @echo "... ChatServer.i" 355 | @echo "... ChatServer.s" 356 | @echo "... ChatService.o" 357 | @echo "... ChatService.i" 358 | @echo "... ChatService.s" 359 | @echo "... main.o" 360 | @echo "... main.i" 361 | @echo "... main.s" 362 | @echo "... model/FriendModel.o" 363 | @echo "... model/FriendModel.i" 364 | @echo "... model/FriendModel.s" 365 | @echo "... model/GroupModel.o" 366 | @echo "... model/GroupModel.i" 367 | @echo "... model/GroupModel.s" 368 | @echo "... model/OfflineMessageModel.o" 369 | @echo "... model/OfflineMessageModel.i" 370 | @echo "... model/OfflineMessageModel.s" 371 | @echo "... model/UserModel.o" 372 | @echo "... model/UserModel.i" 373 | @echo "... model/UserModel.s" 374 | @echo "... redis/Redis.o" 375 | @echo "... redis/Redis.i" 376 | @echo "... redis/Redis.s" 377 | .PHONY : help 378 | 379 | 380 | 381 | #============================================================================= 382 | # Special targets to cleanup operation of make. 383 | 384 | # Special rule to run CMake to check the build system integrity. 385 | # No rule that depends on this can have commands that come from listfiles 386 | # because they might be regenerated. 387 | cmake_check_build_system: 388 | cd /home/ik/桌面/Service/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 389 | .PHONY : cmake_check_build_system 390 | 391 | -------------------------------------------------------------------------------- /Service/src/client/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "json.hpp" 15 | 16 | #include "Group.hpp" 17 | #include "User.hpp" 18 | #include "public.hpp" 19 | 20 | using namespace std; 21 | using json = nlohmann::json; 22 | 23 | #define PASSWOED_LENGTH 50 24 | #define NAME_LENGTH 50 25 | #define BUFFER_SIZE 1024 26 | 27 | //记录当前系统登录的用户信息 28 | User g_current_user; 29 | //记录当前登录用户的好友列表信息 30 | vector g_current_friends_list; 31 | //记录当前登录用户的群组列表信息 32 | vector g_current_group_list; 33 | 34 | //显示当前登录成功用户的基本信息 35 | void ShowCurrentUserData(); 36 | //接收用户收到消息的线程 37 | void ReadTaskHandler(int client_fd); 38 | //获取系统时间 39 | string GetCurrentTime(); 40 | //主聊天页面程序 41 | void MainMenu(int client_fd); 42 | 43 | // "help" command handler 44 | void Help(int fd = 0, string str = ""); 45 | // "chat" command handler 46 | void Chat(int, string); 47 | // "addfriend" command handler 48 | void AddFriend(int, string); 49 | // "creategroup" command handler 50 | void CreateGroup(int, string); 51 | // "addgroup" command handler 52 | void AddGroup(int, string); 53 | // "groupchat" command handler 54 | void GroupChat(int, string); 55 | // "loginout" command handler 56 | void LoginOut(int, string); 57 | 58 | //控制主菜单是否继续显示 59 | bool g_is_menu_running = false; 60 | // 系统支持的客户端命令列表 61 | unordered_map command_map = { 62 | {"help", "显示所有支持的命令,格式help"}, 63 | {"chat", "一对一聊天,格式chat:friendid:message"}, 64 | {"addfriend", "添加好友,格式addfriend:friendid"}, 65 | {"creategroup", "创建群组,格式creategroup:groupname:groupdesc"}, 66 | {"addgroup", "加入群组,格式addgroup:groupid"}, 67 | {"groupchat", "群聊,格式groupchat:groupid:message"}, 68 | {"loginout", "注销,格式loginout"}}; 69 | 70 | // 注册系统支持的客户端命令处理 71 | unordered_map> command_handler_map = { 72 | {"help", Help}, 73 | {"chat", Chat}, 74 | {"addfriend", AddFriend}, 75 | {"creategroup", CreateGroup}, 76 | {"addgroup", AddGroup}, 77 | {"groupchat", GroupChat}, 78 | {"loginout", LoginOut}}; 79 | 80 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 81 | 82 | //main函数主要获取用户的输入,接收线程则是将用户收到的信息打印出来 83 | //集成登录、注册功能 84 | int main(int argc, char **argv) 85 | { 86 | if (argc < 3) 87 | { 88 | cerr << "command invaild example: ./ExeNAME IpAddress port" << endl; 89 | exit(-1); 90 | } 91 | 92 | //解析IP地址和端口号 93 | char *ip = argv[1]; 94 | uint16_t port = atoi(argv[2]); 95 | 96 | //创建socket 97 | int clientfd = socket(AF_INET, SOCK_STREAM, 0); 98 | if (clientfd == -1) 99 | { 100 | cerr << "create socket error" << endl; 101 | exit(-1); 102 | } 103 | 104 | //录入连接server服务器信息 105 | sockaddr_in server; 106 | memset(&server, 0, sizeof(sockaddr_in)); 107 | 108 | server.sin_family = AF_INET; 109 | server.sin_port = htons(port); 110 | server.sin_addr.s_addr = inet_addr(ip); 111 | 112 | //server与clientfd连接 113 | if (-1 == connect(clientfd, (sockaddr *)&server, sizeof(sockaddr_in))) 114 | { 115 | cout << "connect error" << endl; 116 | close(clientfd); 117 | exit(-1); 118 | } 119 | 120 | //主业务 121 | for (;;) 122 | { 123 | //显示首页面菜单 登录,注册,退出 124 | cout << "**********welcome**********" << endl; 125 | cout << " 1. login" << endl; 126 | cout << " 2. register" << endl; 127 | cout << " 3. quit " << endl; 128 | cout << "please input your choice:"; 129 | int choice = 0; 130 | cin >> choice; 131 | //处理读入 缓冲区的回车 132 | cin.get(); 133 | switch (choice) 134 | { 135 | case 1: 136 | { 137 | int id = 0; 138 | char pwd[PASSWOED_LENGTH] = {0}; 139 | cout << "please input id:"; 140 | cin >> id; 141 | cin.get(); 142 | 143 | cout << "please input password:"; 144 | cin.getline(pwd, PASSWOED_LENGTH); 145 | 146 | json js; 147 | js["msgid"] = LOGIN_MSG; 148 | js["id"] = id; 149 | js["password"] = pwd; 150 | string request = js.dump(); 151 | 152 | //发送 153 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 154 | if (len == -1) 155 | { 156 | cerr << "send reg msg error" << endl; 157 | } 158 | else 159 | { 160 | //接收服务器端反馈 161 | char buffer[BUFFER_SIZE] = {0}; 162 | len = recv(clientfd, buffer, BUFFER_SIZE, 0); 163 | if (len == -1) 164 | { 165 | cerr << "recv login response error" << endl; 166 | } 167 | else 168 | { 169 | //反序列化 170 | json response_js = json::parse(buffer); 171 | //登录失败 172 | if (response_js["errno"].get() != 0) 173 | { 174 | cerr << response_js["errmsg"] << endl; 175 | } 176 | else 177 | { 178 | //登陆成功记录当前用户信息、好友信息、群组信息、离线消息 179 | //记录当前用户信息 180 | g_current_user.set_id(response_js["id"].get()); 181 | g_current_user.set_name(response_js["name"]); 182 | 183 | //记录当前用户的好友信息 184 | if (response_js.contains("friends")) 185 | { 186 | vector vec = response_js["friends"]; 187 | for (string &str : vec) 188 | { 189 | json friend_js = json::parse(str); 190 | User user; 191 | user.set_id(friend_js["id"].get()); 192 | user.set_name(friend_js["name"]); 193 | user.set_state(friend_js["state"]); 194 | g_current_friends_list.push_back(user); 195 | } 196 | } 197 | 198 | //群组信息 199 | if (response_js.contains("groups")) 200 | { 201 | vector vec = response_js["groups"]; 202 | for (string &str : vec) 203 | { 204 | json group_js = json::parse(str); 205 | Group group; 206 | group.set_id(group_js["id"].get()); 207 | group.set_name(group_js["groupname"]); 208 | group.set_desc(group_js["groupdesc"]); 209 | 210 | vector vec2 = group_js["users"]; 211 | for (string &user_str : vec2) 212 | { 213 | GroupUser group_user; 214 | json group_user_js = json::parse(user_str); 215 | group_user.set_id(group_user_js["id"].get()); 216 | group_user.set_name(group_user_js["name"]); 217 | group_user.set_state(group_user_js["state"]); 218 | group_user.set_role(group_user_js["role"]); 219 | 220 | group.get_User().push_back(group_user); 221 | } 222 | g_current_group_list.push_back(group); 223 | } 224 | } 225 | 226 | //显示登录用户的基本信息 227 | ShowCurrentUserData(); 228 | 229 | //显示用户的离线消息 230 | if (response_js.contains("offlinemsg")) 231 | { 232 | vector vec = response_js["offlinemsg"]; 233 | for (string &str : vec) 234 | { 235 | json js = json::parse(str); 236 | cout << js["time"].get() << "[" << js["id"] << "]" << js["name"].get() << " said: " << js["msg"].get() << endl; 237 | } 238 | } 239 | 240 | //登录成功 241 | thread read_task(ReadTaskHandler, clientfd); 242 | read_task.detach(); 243 | 244 | //进入主界面 245 | g_is_menu_running = true; 246 | MainMenu(clientfd); 247 | } 248 | } 249 | } 250 | } 251 | break; 252 | case 2: 253 | { 254 | //注册 255 | char name[NAME_LENGTH] = {0}; 256 | char pwd[PASSWOED_LENGTH] = {0}; 257 | cout << "user name:" << endl; 258 | cin.getline(name, NAME_LENGTH); 259 | 260 | cout << "password:" << endl; 261 | cin.getline(pwd, PASSWOED_LENGTH); 262 | 263 | //序列化 264 | json js; 265 | js["msgid"] = REG_MSG; 266 | js["name"] = name; 267 | js["password"] = pwd; 268 | string request = js.dump(); 269 | 270 | //发送 271 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 272 | if (len == -1) 273 | { 274 | cerr << "send reg msg error" << endl; 275 | } 276 | else 277 | { 278 | //接收服务器端反馈 279 | char buffer[BUFFER_SIZE] = {0}; 280 | len = recv(clientfd, buffer, BUFFER_SIZE, 0); 281 | if (len == -1) 282 | { 283 | cerr << "recv register response error" << endl; 284 | } 285 | else 286 | { 287 | cout << "lens: " << len << "buffer :" << buffer << endl; 288 | //反序列化 289 | json response_js = json::parse(buffer); 290 | //注册失败 291 | if (response_js["errno"].get() != 0) 292 | { 293 | cerr << name << " is already exist,register error!" << endl; 294 | } 295 | else 296 | { 297 | //注册成功 298 | cout << name << "register success , and user id: " << response_js["id"] << " , please remeber it!!!" << endl; 299 | } 300 | } 301 | } 302 | } 303 | break; 304 | case 3: 305 | { 306 | //退出 307 | close(clientfd); 308 | exit(0); 309 | } 310 | default: 311 | cerr << "invaild input!" << endl; 312 | break; 313 | } 314 | } 315 | } 316 | 317 | //显示当前登录成功用户的基本信息 318 | void ShowCurrentUserData() 319 | { 320 | cout << "--------------------login user--------------------" << endl; 321 | cout << "current login uer => id: " << g_current_user.get_id() << " name: " << g_current_user.get_name() << endl; 322 | cout << "-------------------friend list-------------------" << endl; 323 | if (!g_current_friends_list.empty()) 324 | { 325 | for (User &user : g_current_friends_list) 326 | { 327 | cout << user.get_id() << " " << user.get_name() << " " << user.get_state() << endl; 328 | } 329 | } 330 | cout << "--------------------group list--------------------" << endl; 331 | if (!g_current_group_list.empty()) 332 | { 333 | for (Group &group : g_current_group_list) 334 | { 335 | cout << group.get_id() << " " << group.get_name() << " " << group.get_desc() << endl; 336 | 337 | //打印群员信息 338 | cout << "========group user========" << endl; 339 | for (GroupUser &group_user : group.get_User()) 340 | { 341 | cout << group_user.get_id() << " " << group_user.get_name() << " " << group_user.get_state() << " " << group_user.get_role() << endl; 342 | } 343 | } 344 | } 345 | cout << "--------------------------------------------------" << endl; 346 | } 347 | 348 | //接收用户收到消息的线程 349 | void ReadTaskHandler(int client_fd) 350 | { 351 | for (;;) 352 | { 353 | char buffer[BUFFER_SIZE] = {0}; 354 | int len = recv(client_fd, buffer, BUFFER_SIZE, 0); 355 | if (len == -1 || len == 0) 356 | { 357 | close(client_fd); 358 | exit(-1); 359 | } 360 | 361 | json js = json::parse(buffer); 362 | //一对一聊天 363 | if (js["msgid"].get() == ONE_CHAT_MSG) 364 | { 365 | cout << js["time"].get() << "[" << js["id"] << "]" << js["name"].get() << " said: " << js["msg"].get() << endl; 366 | continue; 367 | } 368 | else if (js["msgid"].get() == GROUP_CHAT_MSG) 369 | { 370 | cout << "group msg: [" << js["groupid"] << "]"; 371 | cout << js["time"].get() << "[" << js["id"] << "]" << js["name"].get() << " said: " << js["msg"].get() << endl; 372 | continue; 373 | } 374 | } 375 | } 376 | 377 | //获取系统时间 378 | string GetCurrentTime() 379 | { 380 | auto tt = chrono::system_clock::to_time_t(std::chrono::system_clock::now()); 381 | struct tm *ptm = localtime(&tt); 382 | char date[60] = {0}; 383 | sprintf(date, "%d-%02d-%02d %02d:%02d:%02d", 384 | (int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday, 385 | (int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec); 386 | return string(date); 387 | } 388 | 389 | //主聊天页面程序,开闭原则 390 | void MainMenu(int clientfd) 391 | { 392 | Help(); 393 | char buffer[BUFFER_SIZE] = {0}; 394 | while (g_is_menu_running) 395 | { 396 | cin.getline(buffer, BUFFER_SIZE); 397 | string command_buf(buffer); 398 | //存储命令 399 | string command; 400 | int index = command_buf.find(":"); 401 | if (index == -1) 402 | { 403 | //help或者loginout 404 | command = command_buf; 405 | } 406 | else 407 | { 408 | //其他命令 409 | command = command_buf.substr(0, index); 410 | } 411 | 412 | auto it = command_handler_map.find(command); 413 | if (it == command_handler_map.end()) 414 | { 415 | cerr << "invaild input command" << endl; 416 | continue; 417 | } 418 | 419 | //调用命令 420 | it->second(clientfd, command_buf.substr(index + 1, command_buf.size() - index)); 421 | } 422 | } 423 | 424 | //打印系统支持的所有命令 425 | void Help(int, string) 426 | { 427 | cout << "--------command list--------" << endl; 428 | for (auto &it : command_map) 429 | { 430 | cout << it.first << " : " << it.second << endl; 431 | } 432 | cout << endl; 433 | } 434 | 435 | //一对一聊天 436 | void Chat(int clientfd, string str) 437 | { 438 | int index = str.find(":"); 439 | if (index == -1) 440 | { 441 | cerr << "chat command invaild" << endl; 442 | } 443 | 444 | int friend_id = atoi(str.substr(0, index).c_str()); 445 | string message = str.substr(index + 1, str.size() - index); 446 | 447 | json js; 448 | js["msgid"] = ONE_CHAT_MSG; 449 | js["id"] = g_current_user.get_id(); 450 | js["name"] = g_current_user.get_name(); 451 | js["to"] = friend_id; 452 | js["msg"] = message; 453 | js["time"] = GetCurrentTime(); 454 | 455 | string request = js.dump(); 456 | 457 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 458 | if (len == -1) 459 | { 460 | cerr << "send chat msg error" << endl; 461 | } 462 | } 463 | 464 | //添加好友 465 | void AddFriend(int clientfd, string str) 466 | { 467 | int friend_id = atoi(str.c_str()); 468 | 469 | json js; 470 | js["msgid"] = ADD_FRIEND_MSG; 471 | js["id"] = g_current_user.get_id(); 472 | js["friendid"] = friend_id; 473 | 474 | string request = js.dump(); 475 | 476 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 477 | if (len == -1) 478 | { 479 | cerr << "send addfriend msg error" << endl; 480 | } 481 | } 482 | 483 | //创建群聊 484 | void CreateGroup(int clientfd, string str) 485 | { 486 | int index = str.find(":"); 487 | if (index == -1) 488 | { 489 | cerr << "creategroup command invalid!" << endl; 490 | return; 491 | } 492 | 493 | string group_name = str.substr(0, index); 494 | string group_desc = str.substr(index + 1, str.size() - index); 495 | 496 | json js; 497 | js["msgid"] = CREATE_GROUP_MSG; 498 | js["id"] = g_current_user.get_id(); 499 | js["groupname"] = group_name; 500 | js["groupdesc"] = group_desc; 501 | 502 | string request = js.dump(); 503 | 504 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 505 | if (len == -1) 506 | { 507 | cerr << "send creategroup msg error" << endl; 508 | } 509 | } 510 | 511 | //加入群聊 512 | void AddGroup(int clientfd, string str) 513 | { 514 | int group_id = atoi(str.c_str()); 515 | 516 | json js; 517 | js["msgid"] = ADD_GROUP_MSG; 518 | js["id"] = g_current_user.get_id(); 519 | js["groupid"] = group_id; 520 | 521 | string request = js.dump(); 522 | 523 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 524 | if (len == -1) 525 | { 526 | cerr << "send addgroup msg error" << endl; 527 | } 528 | } 529 | 530 | //群聊消息 531 | void GroupChat(int clientfd, string str) 532 | { 533 | int index = str.find(":"); 534 | if (index == -1) 535 | { 536 | cerr << "creategroup command invalid!" << endl; 537 | return; 538 | } 539 | 540 | int group_id = atoi(str.substr(0, index).c_str()); 541 | string message = str.substr(index + 1, str.size() - index); 542 | 543 | json js; 544 | js["msgid"] = GROUP_CHAT_MSG; 545 | js["id"] = g_current_user.get_id(); 546 | js["name"] = g_current_user.get_name(); 547 | js["groupid"] = group_id; 548 | js["msg"] = message; 549 | js["time"] = GetCurrentTime(); 550 | 551 | string request = js.dump(); 552 | 553 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 554 | if (len == -1) 555 | { 556 | cerr << "send grouochat msg error" << endl; 557 | } 558 | } 559 | 560 | //注销 561 | void LoginOut(int clientfd, string) 562 | { 563 | json js; 564 | js["msgid"] = LOGINOUT_MSG; 565 | js["id"] = g_current_user.get_id(); 566 | string buffer = js.dump(); 567 | 568 | string request = js.dump(); 569 | 570 | int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0); 571 | if (len == -1) 572 | { 573 | cerr << "send grouochat msg error" << endl; 574 | } 575 | else 576 | { 577 | g_is_menu_running = false; 578 | g_current_friends_list.clear(); 579 | g_current_group_list.clear(); 580 | } 581 | } 582 | -------------------------------------------------------------------------------- /Service/build/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.cpp: -------------------------------------------------------------------------------- 1 | /* This source file must have a .cpp extension so that all C++ compilers 2 | recognize the extension without flags. Borland does not know .cxx for 3 | example. */ 4 | #ifndef __cplusplus 5 | # error "A C compiler has been selected for C++." 6 | #endif 7 | 8 | 9 | /* Version number components: V=Version, R=Revision, P=Patch 10 | Version date components: YYYY=Year, MM=Month, DD=Day */ 11 | 12 | #if defined(__COMO__) 13 | # define COMPILER_ID "Comeau" 14 | /* __COMO_VERSION__ = VRR */ 15 | # define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) 16 | # define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) 17 | 18 | #elif defined(__INTEL_COMPILER) || defined(__ICC) 19 | # define COMPILER_ID "Intel" 20 | # if defined(_MSC_VER) 21 | # define SIMULATE_ID "MSVC" 22 | # endif 23 | /* __INTEL_COMPILER = VRP */ 24 | # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) 25 | # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) 26 | # if defined(__INTEL_COMPILER_UPDATE) 27 | # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) 28 | # else 29 | # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) 30 | # endif 31 | # if defined(__INTEL_COMPILER_BUILD_DATE) 32 | /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ 33 | # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) 34 | # endif 35 | # if defined(_MSC_VER) 36 | /* _MSC_VER = VVRR */ 37 | # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) 38 | # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) 39 | # endif 40 | 41 | #elif defined(__PATHCC__) 42 | # define COMPILER_ID "PathScale" 43 | # define COMPILER_VERSION_MAJOR DEC(__PATHCC__) 44 | # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) 45 | # if defined(__PATHCC_PATCHLEVEL__) 46 | # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) 47 | # endif 48 | 49 | #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) 50 | # define COMPILER_ID "Embarcadero" 51 | # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) 52 | # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) 53 | # define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) 54 | 55 | #elif defined(__BORLANDC__) 56 | # define COMPILER_ID "Borland" 57 | /* __BORLANDC__ = 0xVRR */ 58 | # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) 59 | # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) 60 | 61 | #elif defined(__WATCOMC__) && __WATCOMC__ < 1200 62 | # define COMPILER_ID "Watcom" 63 | /* __WATCOMC__ = VVRR */ 64 | # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) 65 | # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) 66 | # if (__WATCOMC__ % 10) > 0 67 | # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) 68 | # endif 69 | 70 | #elif defined(__WATCOMC__) 71 | # define COMPILER_ID "OpenWatcom" 72 | /* __WATCOMC__ = VVRP + 1100 */ 73 | # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) 74 | # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) 75 | # if (__WATCOMC__ % 10) > 0 76 | # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) 77 | # endif 78 | 79 | #elif defined(__SUNPRO_CC) 80 | # define COMPILER_ID "SunPro" 81 | # if __SUNPRO_CC >= 0x5100 82 | /* __SUNPRO_CC = 0xVRRP */ 83 | # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) 84 | # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) 85 | # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) 86 | # else 87 | /* __SUNPRO_CC = 0xVRP */ 88 | # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) 89 | # define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) 90 | # define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) 91 | # endif 92 | 93 | #elif defined(__HP_aCC) 94 | # define COMPILER_ID "HP" 95 | /* __HP_aCC = VVRRPP */ 96 | # define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) 97 | # define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) 98 | # define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) 99 | 100 | #elif defined(__DECCXX) 101 | # define COMPILER_ID "Compaq" 102 | /* __DECCXX_VER = VVRRTPPPP */ 103 | # define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) 104 | # define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) 105 | # define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) 106 | 107 | #elif defined(__IBMCPP__) && defined(__COMPILER_VER__) 108 | # define COMPILER_ID "zOS" 109 | /* __IBMCPP__ = VRP */ 110 | # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) 111 | # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) 112 | # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) 113 | 114 | #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 115 | # define COMPILER_ID "XL" 116 | /* __IBMCPP__ = VRP */ 117 | # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) 118 | # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) 119 | # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) 120 | 121 | #elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 122 | # define COMPILER_ID "VisualAge" 123 | /* __IBMCPP__ = VRP */ 124 | # define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) 125 | # define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) 126 | # define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) 127 | 128 | #elif defined(__PGI) 129 | # define COMPILER_ID "PGI" 130 | # define COMPILER_VERSION_MAJOR DEC(__PGIC__) 131 | # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) 132 | # if defined(__PGIC_PATCHLEVEL__) 133 | # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) 134 | # endif 135 | 136 | #elif defined(_CRAYC) 137 | # define COMPILER_ID "Cray" 138 | # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) 139 | # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) 140 | 141 | #elif defined(__TI_COMPILER_VERSION__) 142 | # define COMPILER_ID "TI" 143 | /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ 144 | # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) 145 | # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) 146 | # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) 147 | 148 | #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) 149 | # define COMPILER_ID "Fujitsu" 150 | 151 | #elif defined(__SCO_VERSION__) 152 | # define COMPILER_ID "SCO" 153 | 154 | #elif defined(__clang__) && defined(__apple_build_version__) 155 | # define COMPILER_ID "AppleClang" 156 | # if defined(_MSC_VER) 157 | # define SIMULATE_ID "MSVC" 158 | # endif 159 | # define COMPILER_VERSION_MAJOR DEC(__clang_major__) 160 | # define COMPILER_VERSION_MINOR DEC(__clang_minor__) 161 | # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) 162 | # if defined(_MSC_VER) 163 | /* _MSC_VER = VVRR */ 164 | # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) 165 | # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) 166 | # endif 167 | # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) 168 | 169 | #elif defined(__clang__) 170 | # define COMPILER_ID "Clang" 171 | # if defined(_MSC_VER) 172 | # define SIMULATE_ID "MSVC" 173 | # endif 174 | # define COMPILER_VERSION_MAJOR DEC(__clang_major__) 175 | # define COMPILER_VERSION_MINOR DEC(__clang_minor__) 176 | # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) 177 | # if defined(_MSC_VER) 178 | /* _MSC_VER = VVRR */ 179 | # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) 180 | # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) 181 | # endif 182 | 183 | #elif defined(__GNUC__) || defined(__GNUG__) 184 | # define COMPILER_ID "GNU" 185 | # if defined(__GNUC__) 186 | # define COMPILER_VERSION_MAJOR DEC(__GNUC__) 187 | # else 188 | # define COMPILER_VERSION_MAJOR DEC(__GNUG__) 189 | # endif 190 | # if defined(__GNUC_MINOR__) 191 | # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) 192 | # endif 193 | # if defined(__GNUC_PATCHLEVEL__) 194 | # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) 195 | # endif 196 | 197 | #elif defined(_MSC_VER) 198 | # define COMPILER_ID "MSVC" 199 | /* _MSC_VER = VVRR */ 200 | # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) 201 | # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) 202 | # if defined(_MSC_FULL_VER) 203 | # if _MSC_VER >= 1400 204 | /* _MSC_FULL_VER = VVRRPPPPP */ 205 | # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) 206 | # else 207 | /* _MSC_FULL_VER = VVRRPPPP */ 208 | # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) 209 | # endif 210 | # endif 211 | # if defined(_MSC_BUILD) 212 | # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) 213 | # endif 214 | 215 | #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) 216 | # define COMPILER_ID "ADSP" 217 | #if defined(__VISUALDSPVERSION__) 218 | /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ 219 | # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) 220 | # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) 221 | # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) 222 | #endif 223 | 224 | #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) 225 | # define COMPILER_ID "IAR" 226 | # if defined(__VER__) 227 | # define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) 228 | # define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) 229 | # define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) 230 | # define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) 231 | # endif 232 | 233 | #elif defined(__ARMCC_VERSION) 234 | # define COMPILER_ID "ARMCC" 235 | #if __ARMCC_VERSION >= 1000000 236 | /* __ARMCC_VERSION = VRRPPPP */ 237 | # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) 238 | # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) 239 | # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) 240 | #else 241 | /* __ARMCC_VERSION = VRPPPP */ 242 | # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) 243 | # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) 244 | # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) 245 | #endif 246 | 247 | 248 | #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) 249 | # define COMPILER_ID "MIPSpro" 250 | # if defined(_SGI_COMPILER_VERSION) 251 | /* _SGI_COMPILER_VERSION = VRP */ 252 | # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) 253 | # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) 254 | # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) 255 | # else 256 | /* _COMPILER_VERSION = VRP */ 257 | # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) 258 | # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) 259 | # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) 260 | # endif 261 | 262 | 263 | /* These compilers are either not known or too old to define an 264 | identification macro. Try to identify the platform and guess that 265 | it is the native compiler. */ 266 | #elif defined(__sgi) 267 | # define COMPILER_ID "MIPSpro" 268 | 269 | #elif defined(__hpux) || defined(__hpua) 270 | # define COMPILER_ID "HP" 271 | 272 | #else /* unknown compiler */ 273 | # define COMPILER_ID "" 274 | #endif 275 | 276 | /* Construct the string literal in pieces to prevent the source from 277 | getting matched. Store it in a pointer rather than an array 278 | because some compilers will just produce instructions to fill the 279 | array rather than assigning a pointer to a static array. */ 280 | char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; 281 | #ifdef SIMULATE_ID 282 | char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; 283 | #endif 284 | 285 | #ifdef __QNXNTO__ 286 | char const* qnxnto = "INFO" ":" "qnxnto[]"; 287 | #endif 288 | 289 | #if defined(__CRAYXE) || defined(__CRAYXC) 290 | char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; 291 | #endif 292 | 293 | #define STRINGIFY_HELPER(X) #X 294 | #define STRINGIFY(X) STRINGIFY_HELPER(X) 295 | 296 | /* Identify known platforms by name. */ 297 | #if defined(__linux) || defined(__linux__) || defined(linux) 298 | # define PLATFORM_ID "Linux" 299 | 300 | #elif defined(__CYGWIN__) 301 | # define PLATFORM_ID "Cygwin" 302 | 303 | #elif defined(__MINGW32__) 304 | # define PLATFORM_ID "MinGW" 305 | 306 | #elif defined(__APPLE__) 307 | # define PLATFORM_ID "Darwin" 308 | 309 | #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 310 | # define PLATFORM_ID "Windows" 311 | 312 | #elif defined(__FreeBSD__) || defined(__FreeBSD) 313 | # define PLATFORM_ID "FreeBSD" 314 | 315 | #elif defined(__NetBSD__) || defined(__NetBSD) 316 | # define PLATFORM_ID "NetBSD" 317 | 318 | #elif defined(__OpenBSD__) || defined(__OPENBSD) 319 | # define PLATFORM_ID "OpenBSD" 320 | 321 | #elif defined(__sun) || defined(sun) 322 | # define PLATFORM_ID "SunOS" 323 | 324 | #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) 325 | # define PLATFORM_ID "AIX" 326 | 327 | #elif defined(__sgi) || defined(__sgi__) || defined(_SGI) 328 | # define PLATFORM_ID "IRIX" 329 | 330 | #elif defined(__hpux) || defined(__hpux__) 331 | # define PLATFORM_ID "HP-UX" 332 | 333 | #elif defined(__HAIKU__) 334 | # define PLATFORM_ID "Haiku" 335 | 336 | #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) 337 | # define PLATFORM_ID "BeOS" 338 | 339 | #elif defined(__QNX__) || defined(__QNXNTO__) 340 | # define PLATFORM_ID "QNX" 341 | 342 | #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) 343 | # define PLATFORM_ID "Tru64" 344 | 345 | #elif defined(__riscos) || defined(__riscos__) 346 | # define PLATFORM_ID "RISCos" 347 | 348 | #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) 349 | # define PLATFORM_ID "SINIX" 350 | 351 | #elif defined(__UNIX_SV__) 352 | # define PLATFORM_ID "UNIX_SV" 353 | 354 | #elif defined(__bsdos__) 355 | # define PLATFORM_ID "BSDOS" 356 | 357 | #elif defined(_MPRAS) || defined(MPRAS) 358 | # define PLATFORM_ID "MP-RAS" 359 | 360 | #elif defined(__osf) || defined(__osf__) 361 | # define PLATFORM_ID "OSF1" 362 | 363 | #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) 364 | # define PLATFORM_ID "SCO_SV" 365 | 366 | #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) 367 | # define PLATFORM_ID "ULTRIX" 368 | 369 | #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) 370 | # define PLATFORM_ID "Xenix" 371 | 372 | #elif defined(__WATCOMC__) 373 | # if defined(__LINUX__) 374 | # define PLATFORM_ID "Linux" 375 | 376 | # elif defined(__DOS__) 377 | # define PLATFORM_ID "DOS" 378 | 379 | # elif defined(__OS2__) 380 | # define PLATFORM_ID "OS2" 381 | 382 | # elif defined(__WINDOWS__) 383 | # define PLATFORM_ID "Windows3x" 384 | 385 | # else /* unknown platform */ 386 | # define PLATFORM_ID 387 | # endif 388 | 389 | #else /* unknown platform */ 390 | # define PLATFORM_ID 391 | 392 | #endif 393 | 394 | /* For windows compilers MSVC and Intel we can determine 395 | the architecture of the compiler being used. This is because 396 | the compilers do not have flags that can change the architecture, 397 | but rather depend on which compiler is being used 398 | */ 399 | #if defined(_WIN32) && defined(_MSC_VER) 400 | # if defined(_M_IA64) 401 | # define ARCHITECTURE_ID "IA64" 402 | 403 | # elif defined(_M_X64) || defined(_M_AMD64) 404 | # define ARCHITECTURE_ID "x64" 405 | 406 | # elif defined(_M_IX86) 407 | # define ARCHITECTURE_ID "X86" 408 | 409 | # elif defined(_M_ARM64) 410 | # define ARCHITECTURE_ID "ARM64" 411 | 412 | # elif defined(_M_ARM) 413 | # if _M_ARM == 4 414 | # define ARCHITECTURE_ID "ARMV4I" 415 | # elif _M_ARM == 5 416 | # define ARCHITECTURE_ID "ARMV5I" 417 | # else 418 | # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) 419 | # endif 420 | 421 | # elif defined(_M_MIPS) 422 | # define ARCHITECTURE_ID "MIPS" 423 | 424 | # elif defined(_M_SH) 425 | # define ARCHITECTURE_ID "SHx" 426 | 427 | # else /* unknown architecture */ 428 | # define ARCHITECTURE_ID "" 429 | # endif 430 | 431 | #elif defined(__WATCOMC__) 432 | # if defined(_M_I86) 433 | # define ARCHITECTURE_ID "I86" 434 | 435 | # elif defined(_M_IX86) 436 | # define ARCHITECTURE_ID "X86" 437 | 438 | # else /* unknown architecture */ 439 | # define ARCHITECTURE_ID "" 440 | # endif 441 | 442 | #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) 443 | # if defined(__ICCARM__) 444 | # define ARCHITECTURE_ID "ARM" 445 | 446 | # elif defined(__ICCAVR__) 447 | # define ARCHITECTURE_ID "AVR" 448 | 449 | # else /* unknown architecture */ 450 | # define ARCHITECTURE_ID "" 451 | # endif 452 | #else 453 | # define ARCHITECTURE_ID 454 | #endif 455 | 456 | /* Convert integer to decimal digit literals. */ 457 | #define DEC(n) \ 458 | ('0' + (((n) / 10000000)%10)), \ 459 | ('0' + (((n) / 1000000)%10)), \ 460 | ('0' + (((n) / 100000)%10)), \ 461 | ('0' + (((n) / 10000)%10)), \ 462 | ('0' + (((n) / 1000)%10)), \ 463 | ('0' + (((n) / 100)%10)), \ 464 | ('0' + (((n) / 10)%10)), \ 465 | ('0' + ((n) % 10)) 466 | 467 | /* Convert integer to hex digit literals. */ 468 | #define HEX(n) \ 469 | ('0' + ((n)>>28 & 0xF)), \ 470 | ('0' + ((n)>>24 & 0xF)), \ 471 | ('0' + ((n)>>20 & 0xF)), \ 472 | ('0' + ((n)>>16 & 0xF)), \ 473 | ('0' + ((n)>>12 & 0xF)), \ 474 | ('0' + ((n)>>8 & 0xF)), \ 475 | ('0' + ((n)>>4 & 0xF)), \ 476 | ('0' + ((n) & 0xF)) 477 | 478 | /* Construct a string literal encoding the version number components. */ 479 | #ifdef COMPILER_VERSION_MAJOR 480 | char const info_version[] = { 481 | 'I', 'N', 'F', 'O', ':', 482 | 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', 483 | COMPILER_VERSION_MAJOR, 484 | # ifdef COMPILER_VERSION_MINOR 485 | '.', COMPILER_VERSION_MINOR, 486 | # ifdef COMPILER_VERSION_PATCH 487 | '.', COMPILER_VERSION_PATCH, 488 | # ifdef COMPILER_VERSION_TWEAK 489 | '.', COMPILER_VERSION_TWEAK, 490 | # endif 491 | # endif 492 | # endif 493 | ']','\0'}; 494 | #endif 495 | 496 | /* Construct a string literal encoding the internal version number. */ 497 | #ifdef COMPILER_VERSION_INTERNAL 498 | char const info_version_internal[] = { 499 | 'I', 'N', 'F', 'O', ':', 500 | 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', 501 | 'i','n','t','e','r','n','a','l','[', 502 | COMPILER_VERSION_INTERNAL,']','\0'}; 503 | #endif 504 | 505 | /* Construct a string literal encoding the version number components. */ 506 | #ifdef SIMULATE_VERSION_MAJOR 507 | char const info_simulate_version[] = { 508 | 'I', 'N', 'F', 'O', ':', 509 | 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', 510 | SIMULATE_VERSION_MAJOR, 511 | # ifdef SIMULATE_VERSION_MINOR 512 | '.', SIMULATE_VERSION_MINOR, 513 | # ifdef SIMULATE_VERSION_PATCH 514 | '.', SIMULATE_VERSION_PATCH, 515 | # ifdef SIMULATE_VERSION_TWEAK 516 | '.', SIMULATE_VERSION_TWEAK, 517 | # endif 518 | # endif 519 | # endif 520 | ']','\0'}; 521 | #endif 522 | 523 | /* Construct the string literal in pieces to prevent the source from 524 | getting matched. Store it in a pointer rather than an array 525 | because some compilers will just produce instructions to fill the 526 | array rather than assigning a pointer to a static array. */ 527 | char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; 528 | char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; 529 | 530 | 531 | 532 | 533 | #if defined(_MSC_VER) && defined(_MSVC_LANG) 534 | #define CXX_STD _MSVC_LANG 535 | #else 536 | #define CXX_STD __cplusplus 537 | #endif 538 | 539 | const char* info_language_dialect_default = "INFO" ":" "dialect_default[" 540 | #if CXX_STD > 201402L 541 | "17" 542 | #elif CXX_STD >= 201402L 543 | "14" 544 | #elif CXX_STD >= 201103L 545 | "11" 546 | #else 547 | "98" 548 | #endif 549 | "]"; 550 | 551 | /*--------------------------------------------------------------------------*/ 552 | 553 | int main(int argc, char* argv[]) 554 | { 555 | int require = 0; 556 | require += info_compiler[argc]; 557 | require += info_platform[argc]; 558 | #ifdef COMPILER_VERSION_MAJOR 559 | require += info_version[argc]; 560 | #endif 561 | #ifdef COMPILER_VERSION_INTERNAL 562 | require += info_version_internal[argc]; 563 | #endif 564 | #ifdef SIMULATE_ID 565 | require += info_simulate[argc]; 566 | #endif 567 | #ifdef SIMULATE_VERSION_MAJOR 568 | require += info_simulate_version[argc]; 569 | #endif 570 | #if defined(__CRAYXE) || defined(__CRAYXC) 571 | require += info_cray[argc]; 572 | #endif 573 | require += info_language_dialect_default[argc]; 574 | (void)argv; 575 | return require; 576 | } 577 | --------------------------------------------------------------------------------