提交 708f50a3 编写于 作者: X xuchi

IOCP网络模型支持获取新加入客户端ip

上级 68c24ad4
......@@ -334,6 +334,16 @@ namespace doyou {
}
// 获取新加入客户端本端和远端IP信息
char* GetAcceptExAddrs(IO_DATA_BASE* pIO_DATA, int af)
{
if (AF_INET6 == af) { // ipv6
return GetAcceptExAddrsIpv6(pIO_DATA);
}
return GetAcceptExAddrsIpv4(pIO_DATA); // ipv4
}
// 获取新加入客户端本端和远端IP信息-IPV4
char* GetAcceptExAddrsIpv4(IO_DATA_BASE* pIO_DATA)
{
if (NULL == _getAcceptExAddrs) { // 指针使用前应判空校验
......@@ -351,9 +361,10 @@ namespace doyou {
0,
sizeof(sockaddr_in) + 16, // ipv4
sizeof(sockaddr_in) + 16,
(sockaddr**)pLocalAddr_in,
// 分析:二重指针的强制转化,类型需匹配
(sockaddr**)&pLocalAddr_in,
&nLocalLen,
(sockaddr**)pRemoteAddr_in, // 解析后远端客户端IP信息会存入当前变量
(sockaddr**)&pRemoteAddr_in, // 解析后远端客户端IP信息会存入当前变量
&nRemoteLen
);
......@@ -364,6 +375,38 @@ namespace doyou {
return ip; // 指针变量值拷贝
}
// 获取新加入客户端本端和远端IP信息-IPV6
char* GetAcceptExAddrsIpv6(IO_DATA_BASE* pIO_DATA)
{
if (NULL == _getAcceptExAddrs) {
CELLLog_Error("NULL == _getAcceptExAddrs");
return NULL;
}
int nLocalLen = 0;
int nRemoteLen = 0;
sockaddr_in6* pLocalAddr_in = NULL;
sockaddr_in6* pRemoteAddr_in = NULL;
// 获取远程和本地网络地址
_getAcceptExAddrs(
pIO_DATA->wsabuff.buf,
0,
sizeof(sockaddr_in6) + 16, // ipv6
sizeof(sockaddr_in6) + 16,
(sockaddr**)&pLocalAddr_in,
&nLocalLen,
(sockaddr**)&pRemoteAddr_in,
&nRemoteLen
);
// 获取IP地址-远端客户端, 从para2中获取IPV6地址,存储到para3
static char ip[INET6_ADDRSTRLEN] = {}; // 静态对象
inet_ntop(AF_INET6, &pRemoteAddr_in->sin6_addr, ip, INET6_ADDRSTRLEN - 1); // ?-1: 如果有结束符就不用拷贝
//CELLLog_Info("AcceptEx ipv6[%s]", ip);
return ip; // 指针变量值拷贝
}
private:
// 将AccepEx加载到内存中,函数调用效率更高(原理:通过GUID搜索函数)
......
......@@ -63,10 +63,11 @@ namespace doyou {
// 接收链接完成
if (IO_TYPE::ACCEPT == ioEvent.pIOData->iotype) { // 完成键返回数据是sockServer,说明服务端有新客户端加入
// 服务端socket事件触发
CELLLog_Info("new client[sockfd=%d] to join.\n", ioEvent.pIOData->sockfd); // 目前从返回的数据中无法获取其它信息,因为只传入了sockServer的信息
char* ip = iocp.GetAcceptExAddrs(ioEvent.pIOData, _address_family);
CELLLog_Info("new client[sockfd=%d][ip=%s] to join.\n", ioEvent.pIOData->sockfd, ip); // 目前从返回的数据中无法获取其它信息,因为只传入了sockServer的信息
IocpAccept(ioEvent.pIOData->sockfd); // 客户端socket已知
// 待优化点:投递接收任务前,先校验已经连接的客户端总数是否超过连接上限
// 待优化点:投递接收任务前,先校验已经连接的客户端总数是否超过连接上限-done
// 继续 向Iocp投递接收连接的任务
iocp.PostAccept(&ioData, _address_family);
}
......
......@@ -201,9 +201,10 @@ namespace doyou {
_clientAccept++; // 连接的新客户端被分配给Server,计数+1
// 将新客户端分配给客户数量最少的cellServer
addClientToCELLServer(new Client(cSock, _nSendBuffSize, _nRecvBuffSize));
// 获取IP地址, 从para2中获取IPV6地址,存储到para3
char strIp[64] = {};
inet_ntop(AF_INET6, &clientAddr.sin6_addr, strIp, 64);
char strIp[INET6_ADDRSTRLEN] = {};
inet_ntop(AF_INET6, &clientAddr.sin6_addr, strIp, INET6_ADDRSTRLEN - 1); // ?-1: 如果有结束符就不用拷贝
printf("Accept_Ipv6 : %s\n", strIp); // tmplog
}
else {
......
此差异已折叠。
// 高性能服务器可采用的网络通信模型三选一:select/epoll/iocp/
#include "TcpSelectServer.hpp" // using select, both linux and windows.
//#include "TcpSelectServer.hpp" // using select, both linux and windows.
//#include "TcpEpollServer.hpp" // using epoll, only linux.
//#include "TcpIocpServer.hpp" // using iocp, only windows.
#include "TcpIocpServer.hpp" // using iocp, only windows.
#include "MsgStream.hpp"
#include "Config.hpp"
......@@ -11,7 +11,7 @@
using namespace doyou::io; // 使用名称空间
// 可使用服务模型(三选一):1-TcpSelectServer 2-TcpEpollServer 3-TcpIocpServer
class MyServer : public TcpSelectServer
class MyServer : public TcpIocpServer
{
public:
MyServer()
......
Info [2023-3-31 22:32:39]Log::setLogPath success,<serverLog.txt,w>
Error [2023-3-31 22:32:39]Config::getStr not find <strIP>
Info [2023-3-31 22:32:39]Config::getStr strIP=any
Error [2023-3-31 22:32:39]Config::getStr not find <nPort>
Info [2023-3-31 22:32:39]Config::getInt nPort=4567
Error [2023-3-31 22:32:39]Config::getStr not find <nThread>
Info [2023-3-31 22:32:39]Config::getInt nThread=1
Error [2023-3-31 22:32:39]Config::getStr not find <nSendBuffSize>
Info [2023-3-31 22:32:39]Config::getInt nSendBuffSize=10240
Error [2023-3-31 22:32:39]Config::getStr not find <nRecvBuffSize>
Info [2023-3-31 22:32:39]Config::getInt nRecvBuffSize=8192
Error [2023-3-31 22:32:39]Config::getStr not find <nMaxClient>
Info [2023-3-31 22:32:39]Config::getInt nMaxClient=65535
Info [2023-3-31 22:32:39]create socket<468> success...
Info [2023-3-31 22:32:39]bind port<4567> success...
Info [2023-3-31 22:32:39]listen port<468> success...
Info [2023-3-31 22:32:40]thread<1>,time<1.015804>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:41]thread<1>,time<1.012665>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:42]thread<1>,time<1.005641>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:43]thread<1>,time<1.010654>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:44]thread<1>,time<1.008968>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:45]thread<1>,time<1.000230>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:46]thread<1>,time<1.005774>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:47]thread<1>,time<1.003246>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:48]thread<1>,time<1.003917>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:49]thread<1>,time<1.011160>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:50]thread<1>,time<1.000848>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:51]thread<1>,time<1.003867>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:52]thread<1>,time<1.010758>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:53]thread<1>,time<1.001822>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:54]thread<1>,time<1.004321>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:55]thread<1>,time<1.004184>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:56]thread<1>,time<1.001536>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:57]thread<1>,time<1.000277>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:58]thread<1>,time<1.008580>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:32:59]thread<1>,time<1.007428>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:0]thread<1>,time<1.001152>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:1]thread<1>,time<1.010830>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:2]thread<1>,time<1.012891>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:3]thread<1>,time<1.006799>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:4]thread<1>,time<1.015240>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:5]thread<1>,time<1.014393>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:6]thread<1>,time<1.004565>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:7]thread<1>,time<1.000470>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:8]thread<1>,time<1.007870>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:9]thread<1>,time<1.015320>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:10]thread<1>,time<1.001293>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:11]thread<1>,time<1.009076>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:12]thread<1>,time<1.006654>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:13]thread<1>,time<1.002006>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:14]thread<1>,time<1.003960>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:15]thread<1>,time<1.002160>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:16]thread<1>,time<1.011077>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:17]thread<1>,time<1.004268>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:18]thread<1>,time<1.000327>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:19]thread<1>,time<1.009899>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:20]thread<1>,time<1.004248>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:22]thread<1>,time<1.010211>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:23]thread<1>,time<1.012928>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:24]thread<1>,time<1.003055>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:25]thread<1>,time<1.004246>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:26]thread<1>,time<1.012615>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:27]thread<1>,time<1.015721>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:28]thread<1>,time<1.012698>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:29]thread<1>,time<1.010806>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:30]thread<1>,time<1.000653>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:31]thread<1>,time<1.014312>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:32]thread<1>,time<1.010476>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:33]thread<1>,time<1.002941>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:34]thread<1>,time<1.016947>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:35]thread<1>,time<1.005236>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:36]thread<1>,time<1.003975>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:37]thread<1>,time<1.015653>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:38]thread<1>,time<1.010557>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
Info [2023-3-31 22:33:39]thread<1>,time<1.013520>,socket<468>,Accept<0>,Join<0>,recv<0>,msg<0>
生成启动时间为 2023/3/29 23:08:34。
1>项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\TestDemo\TestDemo.vcxproj”在节点 2 上(Rebuild 个目标)。
1>ClCompile:
D:\software\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /sdl /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TC /analyze- /errorReport:prompt main.c
main.c
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\testdemo\main.c(14): warning C4013: “system”未定义;假设外部返回 int
Link:
D:\software\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.lib" /MACHINE:X86 Debug\main.obj
TestDemo.vcxproj -> E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\Debug\TestDemo.exe
1>已完成生成项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\TestDemo\TestDemo.vcxproj”(Rebuild 个目标)的操作。
生成成功。
已用时间 00:00:01.30
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\MAIN.C
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\MAIN.C
#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
Debug|Win32|E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\|
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\MAIN.C
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\DEBUG\MAIN.OBJ
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\DEBUG\MAIN.OBJ
B^E:\FILES\技术DOC\ENGINE2.0\ENGINE2.0\ENGINE2.0\ENGINE2.0\TESTDEMO\DEBUG\MAIN.OBJ
......@@ -38,7 +38,14 @@
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)\..\bin\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\..\tmp\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)\..\bin\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\..\tmp\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
......
生成启动时间为 2023/3/31 22:36:47。
1>项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\EasyClient\EasyClient.vcxproj”在节点 2 上(Rebuild 个目标)。
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(388,5): warning MSB8028: The intermediate directory (E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\tmp\Debug\) contains files shared from another project (EasyServer.vcxproj, Engine1.0.vcxproj, TestDemo.vcxproj). This can lead to incorrect clean and rebuild behavior.
1>ClCompile:
D:\software\VC\bin\CL.exe /c /I..\Depends\include /ZI /nologo /W3 /WX- /sdl- /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\tmp\Debug\\" /Fd"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\tmp\Debug\vc120.pdb" /Gd /TP /analyze- /errorReport:prompt client.cpp
client.cpp
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(70): warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\time.inl(112) : 参见“localtime”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(71): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\stdio.h(356) : 参见“sprintf”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(74): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\stdio.h(356) : 参见“sprintf”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(78): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\stdio.h(211) : 参见“fopen”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\easyclient\client.cpp(118): warning C4800: “int”: 将值强制为布尔值“true”或“false”(性能警告)
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\easyclient\client.cpp(230): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\string.h(112) : 参见“strcpy”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\easyclient\client.cpp(231): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\string.h(112) : 参见“strcpy”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\easyclient\client.cpp(322): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\stdio.h(283) : 参见“scanf”的声明
1>e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(197): warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\software\vc\include\time.inl(112) : 参见“localtime”的声明
e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(99): 参见对正在编译的函数 模板 实例化“void doyou::io::Log::EchoReal<const char*>(bool,const char *,const char *,const char *)”的引用
e:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\depends\include\log.hpp(91): 参见对正在编译的函数 模板 实例化“void doyou::io::Log::PError<const char*>(const char *,const char *)”的引用
Link:
D:\software\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\bin\Debug\EasyClient.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\bin\Debug\EasyClient.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\bin\Debug\EasyClient.lib" /MACHINE:X86 "E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\tmp\Debug\client.obj"
EasyClient.vcxproj -> E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\\..\bin\Debug\EasyClient.exe
1>已完成生成项目“E:\files\技术doc\engine2.0\engine2.0\engine2.0\engine2.0\EasyClient\EasyClient.vcxproj”(Rebuild 个目标)的操作。
生成成功。
已用时间 00:00:02.24
生成启动时间为 2023/3/31 22:42:24。
生成成功。
已用时间 00:00:00.04
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册