Skip to content

Commit f7fa644

Browse files
committed
added:upload connect limit
1 parent 3b72e8a commit f7fa644

File tree

7 files changed

+106
-11
lines changed

7 files changed

+106
-11
lines changed

XEngine_Source/StorageModule_Session/Session_Define.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,12 @@ extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr);
283283
/********************************************************************
284284
函数名称:Session_UPStroage_Init
285285
函数功能:初始化上传会话管理器
286-
参数.一:bUPResume
286+
参数.一:nMaxConnect
287+
In/Out:In
288+
类型:整数型
289+
可空:N
290+
意思:输入连接数限制
291+
参数.二:bUPResume
287292
In/Out:In
288293
类型:逻辑型
289294
可空:Y
@@ -293,7 +298,7 @@ extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr);
293298
意思:是否成功
294299
备注:
295300
*********************************************************************/
296-
extern "C" BOOL Session_UPStroage_Init(BOOL bUPResume = FALSE);
301+
extern "C" BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume = FALSE);
297302
/********************************************************************
298303
函数名称:Session_UPStroage_Destory
299304
函数功能:销毁下载管理器
@@ -450,4 +455,18 @@ extern "C" BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr);
450455
意思:是否成功
451456
备注:
452457
*********************************************************************/
453-
extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr);
458+
extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr);
459+
/********************************************************************
460+
函数名称:Session_UPStroage_MaxConnect
461+
函数功能:判断一个地址是否超过连接数限制
462+
参数.一:lpszClientAddr
463+
In/Out:In
464+
类型:常量字符指针
465+
可空:N
466+
意思:输入要处理的地址
467+
返回值
468+
类型:逻辑型
469+
意思:是否成功
470+
备注:
471+
*********************************************************************/
472+
extern "C" BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr);

XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ CSession_UPStroage::~CSession_UPStroage()
2323
/********************************************************************
2424
函数名称:Session_UPStroage_Init
2525
函数功能:初始化上传会话管理器
26-
参数.一:bUPResume
26+
参数.一:nMaxConnect
27+
In/Out:In
28+
类型:整数型
29+
可空:N
30+
意思:输入连接数限制
31+
参数.二:bUPResume
2732
In/Out:In
2833
类型:逻辑型
2934
可空:Y
@@ -33,11 +38,12 @@ CSession_UPStroage::~CSession_UPStroage()
3338
意思:是否成功
3439
备注:
3540
*********************************************************************/
36-
BOOL CSession_UPStroage::Session_UPStroage_Init(BOOL bUPResume)
41+
BOOL CSession_UPStroage::Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume /* = FALSE */)
3742
{
3843
Session_IsErrorOccur = FALSE;
3944

4045
m_bResume = bUPResume;
46+
m_nMaxConnect = nMaxConnect;
4147
return TRUE;
4248
}
4349
/********************************************************************
@@ -413,4 +419,53 @@ BOOL CSession_UPStroage::Session_UPStroage_Close(LPCTSTR lpszClientAddr)
413419
}
414420
st_Locker.unlock_shared();
415421
return TRUE;
422+
}
423+
/********************************************************************
424+
函数名称:Session_UPStroage_MaxConnect
425+
函数功能:判断一个地址是否超过连接数限制
426+
参数.一:lpszClientAddr
427+
In/Out:In
428+
类型:常量字符指针
429+
可空:N
430+
意思:输入要处理的地址
431+
返回值
432+
类型:逻辑型
433+
意思:是否成功
434+
备注:
435+
*********************************************************************/
436+
BOOL CSession_UPStroage::Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr)
437+
{
438+
Session_IsErrorOccur = FALSE;
439+
440+
int nExistNumber = 0;
441+
st_Locker.lock_shared();
442+
unordered_map<string, SESSION_STORAGEUPLOADER>::iterator stl_MapIterator = stl_MapStroage.begin();
443+
for (; stl_MapIterator != stl_MapStroage.end(); stl_MapIterator++)
444+
{
445+
TCHAR tszIPSource[128];
446+
TCHAR tszIPDest[128];
447+
448+
memset(tszIPSource, '\0', sizeof(tszIPSource));
449+
memset(tszIPDest, '\0', sizeof(tszIPDest));
450+
451+
_tcscpy(tszIPSource, stl_MapIterator->first.c_str());
452+
_tcscpy(tszIPDest, lpszClientAddr);
453+
454+
BaseLib_OperatorIPAddr_SegAddr(tszIPSource);
455+
BaseLib_OperatorIPAddr_SegAddr(tszIPDest);
456+
457+
if (0 == _tcscmp(tszIPSource, tszIPDest))
458+
{
459+
nExistNumber++;
460+
}
461+
}
462+
st_Locker.unlock_shared();
463+
464+
if (nExistNumber > m_nMaxConnect)
465+
{
466+
Session_IsErrorOccur = TRUE;
467+
Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_MAXCONNECT;
468+
return FALSE;
469+
}
470+
return TRUE;
416471
}

XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class CSession_UPStroage
2222
CSession_UPStroage();
2323
~CSession_UPStroage();
2424
public:
25-
BOOL Session_UPStroage_Init(BOOL bUPResume = FALSE);
25+
BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume = FALSE);
2626
BOOL Session_UPStroage_Destory();
2727
BOOL Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x nFileSize, __int64x nLeftCount, int nPosStart = 0, int nPostEnd = 0);
2828
BOOL Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo);
@@ -31,8 +31,10 @@ class CSession_UPStroage
3131
BOOL Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount);
3232
BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr);
3333
BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr);
34+
BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr);
3435
private:
3536
BOOL m_bResume;
37+
int m_nMaxConnect;
3638
private:
3739
shared_mutex st_Locker;
3840
private:

XEngine_Source/StorageModule_Session/StorageModule_Session.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ EXPORTS
2626
Session_UPStroage_Exist
2727
Session_UPStorage_GetAll
2828
Session_UPStroage_Delete
29-
Session_UPStroage_Close
29+
Session_UPStroage_Close
30+
Session_UPStroage_MaxConnect

XEngine_Source/StorageModule_Session/pch.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr)
8888
{
8989
return m_DLStorage.Session_DLStroage_MaxConnect(lpszClientAddr);
9090
}
91-
extern "C" BOOL Session_UPStroage_Init(BOOL bUPResume)
91+
extern "C" BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume)
9292
{
93-
return m_UPStorage.Session_UPStroage_Init(bUPResume);
93+
return m_UPStorage.Session_UPStroage_Init(nMaxConnect, bUPResume);
9494
}
9595
extern "C" BOOL Session_UPStroage_Destory()
9696
{
@@ -123,4 +123,8 @@ extern "C" BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr)
123123
extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr)
124124
{
125125
return m_UPStorage.Session_UPStroage_Close(lpszClientAddr);
126+
}
127+
extern "C" BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr)
128+
{
129+
return m_UPStorage.Session_UPStroage_MaxConnect(lpszClientAddr);
126130
}

XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in
6262
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,发送的方法:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod);
6363
return FALSE;
6464
}
65+
//连接数限制处理
66+
if (st_ServiceCfg.st_XLimit.nMaxUPConnect > 0)
67+
{
68+
if (!Session_DLStroage_MaxConnect(lpszClientAddr))
69+
{
70+
st_HDRParam.bIsClose = TRUE;
71+
st_HDRParam.nHttpCode = 503;
72+
73+
RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
74+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
75+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxUPConnect);
76+
return FALSE;
77+
}
78+
}
6579
//用户验证
6680
if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth)
6781
{

XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,12 @@ int main(int argc, char** argv)
294294
}
295295
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP上传服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageUPThread);
296296

297-
if (!Session_UPStroage_Init(st_ServiceCfg.st_XStorage.bResumable))
297+
if (!Session_UPStroage_Init(st_ServiceCfg.st_XLimit.nMaxUPConnect, st_ServiceCfg.st_XStorage.bResumable))
298298
{
299299
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动上传会话服务失败,错误:%lX"), Session_GetLastError());
300300
goto XENGINE_EXITAPP;
301301
}
302-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动上传会话服务成功"));
302+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动上传会话服务成功,连接数限制;%d"), st_ServiceCfg.st_XLimit.nMaxUPConnect);
303303

304304
if (st_ServiceCfg.st_XCert.bUPEnable)
305305
{

0 commit comments

Comments
 (0)