From 94233773d8ff7b0095f408217b2c874e2bf63f49 Mon Sep 17 00:00:00 2001 From: xuchi Date: Fri, 14 Apr 2023 23:39:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E8=AE=A4=E8=AF=86http?= =?UTF-8?q?=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Depends/include/TcpServerMgr.hpp | 6 ++- engine2.0/engine2.0/Doc/Record.txt | 20 +++++++++ engine2.0/engine2.0/HelloHttp/ServerLog.txt | 41 ++++++++++++++++++ engine2.0/engine2.0/engine2.0.sdf | Bin 42139648 -> 42139648 bytes engine2.0/engine2.0/engine2.0.v12.suo | Bin 75264 -> 71680 bytes 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 engine2.0/engine2.0/HelloHttp/ServerLog.txt diff --git a/engine2.0/engine2.0/Depends/include/TcpServerMgr.hpp b/engine2.0/engine2.0/Depends/include/TcpServerMgr.hpp index 0dce117..4cf6e4f 100644 --- a/engine2.0/engine2.0/Depends/include/TcpServerMgr.hpp +++ b/engine2.0/engine2.0/Depends/include/TcpServerMgr.hpp @@ -3,7 +3,8 @@ // 在不同操作系统下面选择最佳网络通信模型 #if _WIN32 // windows系统下面会定义此宏 - #include "TcpIocpServer.hpp" // using iocp, only windows. + //#include "TcpIocpServer.hpp" // using iocp, only windows. + #include "TcpSelectServer.hpp" // 方便讲解 #elif __linux__ // 在linux系统下面会定义此宏 #include "TcpEpollServer.hpp" // using epoll, only linux. #else @@ -15,7 +16,8 @@ namespace doyou { namespace io { #if _WIN32 - typedef TcpIocpServer TcpServerMgr; + //typedef TcpIocpServer TcpServerMgr; + typedef TcpSelectServer TcpServerMgr; #elif __linux__ typedef TcpEpollServer TcpServerMgr; #else diff --git a/engine2.0/engine2.0/Doc/Record.txt b/engine2.0/engine2.0/Doc/Record.txt index b497c45..11eb027 100644 --- a/engine2.0/engine2.0/Doc/Record.txt +++ b/engine2.0/engine2.0/Doc/Record.txt @@ -78,5 +78,25 @@ IP直接存入黑名单中,所以,服务端获取客户端IP地址很有意 24.在一个进程中,主线程已经退出,子线程还没有退出,子线程会被破退出,同时可能出现系统错误。 +25.IOCP网络模型是采用异步方式实现的。 + +26.当前服务器程序存在问题:客户端在发送一个随机字符串数据请求时,程序可能会崩溃。 +服务器程序的健壮性有待提高。要处理这种异常情况。 + +27.http请求解析(简单认知:域名,IP地址,http服务器之间的关系): +示例: +// http请求行 +GET /login.php HTTP/1.1\r\n +// http请求头 +Host: 127.0.0.1:4567\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nsec-ch-ua: \"Chromium\";v=\"112\", \"Microsoft Edge\";v=\"112\", \"Not:A-Brand\";v=\"99\"\r\nsec-ch-ua-mobile: ?0\r\nsec-ch-ua-p... +// http请求体为空 + +当在浏览器通过域名或ip+port方式可以访问http服务器,可以向指定http服务器发送一条网络消息, +示例如上。 +http协议不一定是基于TCP的,只需要一个保证数据传输的协议即可。当前很多http的连接 +都是通过tcp的连接方式,先通过tcp连接到服务器,再建立http协议数据的传输。所以, +通过域名或者URL也能访问到tcp的服务端,tcp服务器并不是一个web服务器,但是只要http +提供了正常的ip+port就能访问到。并且,tcp服务器收到了正确的数据。 + diff --git a/engine2.0/engine2.0/HelloHttp/ServerLog.txt b/engine2.0/engine2.0/HelloHttp/ServerLog.txt new file mode 100644 index 0000000..31b88f4 --- /dev/null +++ b/engine2.0/engine2.0/HelloHttp/ServerLog.txt @@ -0,0 +1,41 @@ +Info [2023-4-14 22:51:14]Log::setLogPath success, +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getStr strIP=any +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getInt nPort=4567 +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getInt nThread=1 +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getInt nSendBuffSize=10240 +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getInt nRecvBuffSize=8192 +Error [2023-4-14 22:51:14]Config::getStr not find +Info [2023-4-14 22:51:14]Config::getInt nMaxClient=65535 +Info [2023-4-14 22:51:14]-ipv4 +Info [2023-4-14 22:51:14]create socket<448> success... +Info [2023-4-14 22:51:14]bind port<4567> success... +Info [2023-4-14 22:51:14]listen port<448> success... +Info [2023-4-14 22:51:15]thread<1>,time<1.004794>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:16]thread<1>,time<1.007067>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:17]thread<1>,time<1.008760>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:18]thread<1>,time<1.008488>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:19]thread<1>,time<1.008667>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:20]thread<1>,time<1.003613>,socket<448>,Accept<0>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 22:51:21]Accept_Ipv4 : 127.0.0.1 + +Info [2023-4-14 23:10:40]Accept_Ipv4 : 127.0.0.1 + +Info [2023-4-14 23:10:40]thread<1>,time<15.195773>,socket<448>,Accept<2>,Join<2>,recv<0>,msg<0> +Info [2023-4-14 23:10:40]checkHeart dead:s=496,time=1159802 +Info [2023-4-14 23:10:40]~Client[sId=1 id=1 socket=496] +Info [2023-4-14 23:10:41]Client::Destory[sId=1 id=1 socket=496] +Info [2023-4-14 23:10:41]checkHeart dead:s=500,time=1159802 +Info [2023-4-14 23:10:41]Accept_Ipv4 : 127.0.0.1 + +Info [2023-4-14 23:10:41]~Client[sId=1 id=2 socket=500] +Info [2023-4-14 23:10:41]Client::Destory[sId=1 id=2 socket=500] +Info [2023-4-14 23:10:41]thread<1>,time<1.005550>,socket<448>,Accept<1>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 23:10:43]thread<1>,time<1.006655>,socket<448>,Accept<1>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 23:10:44]thread<1>,time<1.006405>,socket<448>,Accept<1>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 23:10:45]thread<1>,time<1.008284>,socket<448>,Accept<1>,Join<0>,recv<0>,msg<0> +Info [2023-4-14 23:10:46]thread<1>,time<1.009576>,socket<448>,Accept<1>,Join<0>,recv<0>,msg<0> diff --git a/engine2.0/engine2.0/engine2.0.sdf b/engine2.0/engine2.0/engine2.0.sdf index cf48cfda564349363cacf650060660a78696431d..b54fdf13121003860719ca87e9499f005c7c6c4f 100644 GIT binary patch delta 10403 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 W;6bnvYyx$l9@u~#pJbb{?tcNmR_@;b diff --git a/engine2.0/engine2.0/engine2.0.v12.suo b/engine2.0/engine2.0/engine2.0.v12.suo index 0a11cf462b48d71eb973b0fa7a15dc654f4bf1f8..c201607936f6f6076f12927eb2ea4396a350bd99 100644 GIT binary patch delta 6975 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 LHoVEnLGOP6Qg|BB -- GitLab