Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
一个会的不多的人
engine2.0
提交
2ab8f84b
E
engine2.0
项目概览
一个会的不多的人
/
engine2.0
与 Fork 源项目一致
Fork自
xc13262215230 / engine2.0
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine2.0
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2ab8f84b
编写于
3月 18, 2023
作者:
X
xuchi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
windows系统支持ipv6
上级
966c575e
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
35 addition
and
12 deletion
+35
-12
engine2.0/engine2.0/Depends/include/TcpServer.hpp
engine2.0/engine2.0/Depends/include/TcpServer.hpp
+10
-5
engine2.0/engine2.0/Doc/Record.txt
engine2.0/engine2.0/Doc/Record.txt
+8
-1
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj
+1
-0
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters
+3
-0
engine2.0/engine2.0/EasyServer/server.cpp
engine2.0/engine2.0/EasyServer/server.cpp
+13
-6
engine2.0/engine2.0/engine2.0.sdf
engine2.0/engine2.0/engine2.0.sdf
+0
-0
engine2.0/engine2.0/engine2.0.v12.suo
engine2.0/engine2.0/engine2.0.v12.suo
+0
-0
未找到文件。
engine2.0/engine2.0/Depends/include/TcpServer.hpp
浏览文件 @
2ab8f84b
...
...
@@ -193,15 +193,18 @@ namespace doyou {
}
else
{
NetWork
::
make_reuseaddr
(
cSock
);
// 处理程序关闭及时释放socket资源,可立即重用
//CELLLog_Info("accept cSock<%d>", cSock);
// 客户端链接上限校验
if
(
_clientAccept
<
_nMaxClient
)
{
_clientAccept
++
;
// 连接的新客户端被分配给Server,计数+1
NetWork
::
make_reuseaddr
(
cSock
);
// 将新客户端分配给客户数量最少的cellServer
addClientToCELLServer
(
new
Client
(
cSock
,
_nSendBuffSize
,
_nRecvBuffSize
));
// 获取IP地址 inet_ntoa(clientAddr.sin_addr)
// 获取IP地址, 从para2中获取IPV6地址,存储到para3
char
strIp
[
64
]
=
{};
inet_ntop
(
AF_INET6
,
&
clientAddr
.
sin6_addr
,
strIp
,
64
);
printf
(
"Accept_Ipv6 : %s
\n
"
,
strIp
);
// tmplog
}
else
{
// 获取IP地址 inet_ntoa(clientAddr.sin_addr)
...
...
@@ -221,7 +224,7 @@ namespace doyou {
// 接受客户端连接-ipv4
SOCKET
Accept_Ipv4
()
{
sockaddr_in
clientAddr
=
{};
sockaddr_in
clientAddr
=
{};
// 存储新连接客户端信息结构体对象
int
nAddrLen
=
sizeof
(
sockaddr_in
);
SOCKET
cSock
=
INVALID_SOCKET
;
#ifdef _WIN32
...
...
@@ -237,15 +240,17 @@ namespace doyou {
}
else
{
NetWork
::
make_reuseaddr
(
cSock
);
//CELLLog_Info("accept cSock<%d>", cSock);
// 客户端链接上限校验
if
(
_clientAccept
<
_nMaxClient
)
{
_clientAccept
++
;
// 连接的新客户端被分配给Server,计数+1
NetWork
::
make_reuseaddr
(
cSock
);
// 将新客户端分配给客户数量最少的cellServer
addClientToCELLServer
(
new
Client
(
cSock
,
_nSendBuffSize
,
_nRecvBuffSize
));
// 获取IP地址 inet_ntoa(clientAddr.sin_addr)
// 获取IP地址
char
*
strIp
=
inet_ntoa
(
clientAddr
.
sin_addr
);
printf
(
"Accept_Ipv4 : %s
\n
"
,
strIp
);
// tmplog
}
else
{
// 获取IP地址 inet_ntoa(clientAddr.sin_addr)
...
...
engine2.0/engine2.0/Doc/Record.txt
浏览文件 @
2ab8f84b
// 高性能网络通信服务器2.0关键技术点总结DOC
// 开始时间[2023-3-8 to 至今]
// 欲速则不达
// 欲速则不达
qzfull 工欲善其事必先利其器
// 请按照规范进行标准注释
1.消息缓冲区设置大小应该依据消息size来加以考虑。
...
...
@@ -13,7 +13,14 @@
4.新写函数不能识别,可能是没有添加头文件,可以F1按键,跳转到MSDN进行查看。
5.服务端和客户端要么同时用ipv4, 要么同时用ipv6, 混搭是不行的,比如ipv4客户端是不能链接ipv6服务端。
总之,客户端和服务端采用的ip协议版本必须保持一致,才能正常进行网络通信。
6.编码建议:函数太长了就要封装更小的函数,以避免代码冗余。建议函数上限30行。
7.理论上讲,服务器每接收一个新的客户端连接,都应该把对应ip地址信息,存储在对应的客户端对象中,
并对Ip地址进行安全性分析,采用白名单或黑名单等,去除恶意IP.
8.代码有相同的部分,可以封装成独立函数调用,以避免代码冗余。
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj
浏览文件 @
2ab8f84b
...
...
@@ -77,6 +77,7 @@
</ItemGroup>
<ItemGroup>
<None
Include=
"..\..\bin\Debug\TcpEasyServer_wins_ipv4.bat"
/>
<None
Include=
"..\..\bin\Debug\TcpEasyServer_wins_ipv6.bat"
/>
</ItemGroup>
<Import
Project=
"$(VCTargetsPath)\Microsoft.Cpp.targets"
/>
<ImportGroup
Label=
"ExtensionTargets"
>
...
...
engine2.0/engine2.0/EasyServer/EasyServer.vcxproj.filters
浏览文件 @
2ab8f84b
...
...
@@ -23,5 +23,8 @@
<None
Include=
"..\..\bin\Debug\TcpEasyServer_wins_ipv4.bat"
>
<Filter>
头文件
</Filter>
</None>
<None
Include=
"..\..\bin\Debug\TcpEasyServer_wins_ipv6.bat"
>
<Filter>
头文件
</Filter>
</None>
</ItemGroup>
</Project>
\ No newline at end of file
engine2.0/engine2.0/EasyServer/server.cpp
浏览文件 @
2ab8f84b
// 高性能服务器可采用的网络通信模型三选一: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
Tcp
Iocp
Server
class
MyServer
:
public
Tcp
Select
Server
{
public:
MyServer
()
...
...
@@ -168,9 +168,10 @@ int argToInt(int argc, char* args[], int index, int def, const char* argName)
return
def
;
}
// 通过程序启动参数传入main的方式获取配置信息
int
main
(
int
argc
,
char
*
args
[])
{
//设置运行日志名称
//
设置运行日志名称
Log
::
Instance
().
setLogPath
(
"serverLog"
,
"w"
,
false
);
Config
::
Instance
().
Init
(
argc
,
args
);
...
...
@@ -188,8 +189,14 @@ int main(int argc, char* args[])
strIP
=
nullptr
;
}
MyServer
server
;
server
.
InitSocket
();
MyServer
server
;
// 在栈空间实例化对象
if
(
Config
::
Instance
().
hasKey
(
"-ipv6"
))
{
server
.
InitSocket
(
AF_INET6
);
}
else
{
server
.
InitSocket
();
}
server
.
Bind
(
strIP
,
nPort
);
//server.Bind(strIP, nPort);
// 分析:服务器同一时刻能监听的最大客户端数量,可以提高服务器连接客户端的效率
...
...
engine2.0/engine2.0/engine2.0.sdf
浏览文件 @
2ab8f84b
无法预览此类型文件
engine2.0/engine2.0/engine2.0.v12.suo
浏览文件 @
2ab8f84b
无法预览此类型文件
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录