提交 2ab8f84b 编写于 作者: X xuchi

windows系统支持ipv6

上级 966c575e
......@@ -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)
......
// 高性能网络通信服务器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.代码有相同的部分,可以封装成独立函数调用,以避免代码冗余。
......@@ -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">
......
......@@ -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
// 高性能服务器可采用的网络通信模型三选一: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 TcpIocpServer
class MyServer : public TcpSelectServer
{
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);
// 分析:服务器同一时刻能监听的最大客户端数量,可以提高服务器连接客户端的效率
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册