Skip to content

Commit de3befb

Browse files
committed
added:use send callback to download file
modify:support two mode with download
1 parent e611878 commit de3befb

File tree

6 files changed

+81
-6
lines changed

6 files changed

+81
-6
lines changed

XEngine_Release/XEngine_Config/XEngine_Config.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
},
3838
"XStorage": {
3939
"nHashMode": 2,
40+
"nSendMode": 1,
4041
"bRename": 0,
4142
"tszFileDir": "/home/ubuntu/桌面/XEngine_Storage/XEngine_Source/Debug/XEngine_File"
4243
},
@@ -68,6 +69,7 @@
6869
},
6970
"XVer": {
7071
"StorageVersion": [
72+
"2.4.0.1001 Build20210917",
7173
"2.3.0.1001 Build20210903",
7274
"2.2.0.1001 Build20210820",
7375
"2.1.0.1001 Build20210805",

XEngine_Source/StorageModule_Config/Config_Define.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ typedef struct tag_XEngine_ServerConfig
6464
struct
6565
{
6666
BOOL bRename;
67+
int nSendMode;
6768
int nHashMode;
6869
TCHAR tszFileDir[MAX_PATH];
6970
}st_XStorage;

XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,15 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile,XENGINE_SERVERCONFIG
125125
_tcscpy(pSt_ServerConfig->st_XSql.tszSQLPass, st_JsonXSql["SQLPass"].asCString());
126126
_tcscpy(pSt_ServerConfig->st_XSql.tszSQLFile, st_JsonXSql["SQLFile"].asCString());
127127

128-
if (st_JsonRoot["XStorage"].empty() || (3 != st_JsonRoot["XStorage"].size()))
128+
if (st_JsonRoot["XStorage"].empty() || (4 != st_JsonRoot["XStorage"].size()))
129129
{
130130
Config_IsErrorOccur = TRUE;
131131
Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE;
132132
return FALSE;
133133
}
134134
Json::Value st_JsonXStorage = st_JsonRoot["XStorage"];
135135
pSt_ServerConfig->st_XStorage.nHashMode = st_JsonXStorage["nHashMode"].asInt();
136+
pSt_ServerConfig->st_XStorage.nSendMode = st_JsonXStorage["nSendMode"].asInt();
136137
pSt_ServerConfig->st_XStorage.bRename = st_JsonXStorage["bRename"].asInt();
137138
_tcscpy(pSt_ServerConfig->st_XStorage.tszFileDir, st_JsonXStorage["tszFileDir"].asCString());
138139

XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,55 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam)
4141
}
4242
return 0;
4343
}
44+
45+
void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
46+
{
47+
int nThreadPos = 0; //回调模式不需要发送线程池
48+
int nMsgLen = 4096;
49+
TCHAR tszMsgBuffer[4096];
50+
memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer));
51+
52+
if (Session_DLStroage_GetBuffer(nThreadPos, lpszClientAddr, tszMsgBuffer, &nMsgLen))
53+
{
54+
if (nMsgLen <= 0)
55+
{
56+
if (st_ServiceCfg.st_XProxy.st_XProxyPass.bDLPass)
57+
{
58+
int nPLen = MAX_PATH;
59+
int nHttpCode = 0;
60+
UCHAR tszHashKey[MAX_PATH];
61+
TCHAR tszHashStr[MAX_PATH];
62+
TCHAR tszProxyStr[MAX_PATH];
63+
SESSION_STORAGEINFO st_StorageInfo;
64+
65+
memset(tszHashKey, '\0', MAX_PATH);
66+
memset(tszHashStr, '\0', MAX_PATH);
67+
memset(tszProxyStr, '\0', MAX_PATH);
68+
memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO));
69+
70+
OPenSsl_Api_Digest(st_StorageInfo.tszFileDir, tszHashKey, NULL, TRUE, st_ServiceCfg.st_XStorage.nHashMode);
71+
BaseLib_OperatorString_StrToHex((char*)tszHashKey, 20, tszHashStr);
72+
Session_DLStroage_GetInfo(nThreadPos, lpszClientAddr, &st_StorageInfo);
73+
74+
XStorageProtocol_Proxy_PacketUPDown(st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, tszProxyStr, &nPLen, tszHashStr);
75+
APIHelp_HttpRequest_Post(st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass, tszProxyStr, &nHttpCode);
76+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass);
77+
}
78+
NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr);
79+
Session_DLStroage_Delete(lpszClientAddr);
80+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T("下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表"), lpszClientAddr);
81+
}
82+
else
83+
{
84+
XEngine_Task_SendDownload(lpszClientAddr, tszMsgBuffer, nMsgLen);
85+
}
86+
}
87+
else
88+
{
89+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,获取用户对应文件内容失败,错误:%lX"), lpszClientAddr, Session_GetLastError());
90+
}
91+
}
92+
4493
XHTHREAD CALLBACK XEngine_Download_SendThread(LPVOID lParam)
4594
{
4695
int nThreadPos = *(int*)lParam;
@@ -188,6 +237,20 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in
188237
_tcscpy(st_HDRParam.tszMimeType, _T("bin"));
189238
RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize);
190239
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
240+
//不能在send之前调用
241+
if (2 == st_ServiceCfg.st_XStorage.nSendMode)
242+
{
243+
if (!NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend))
244+
{
245+
st_HDRParam.bIsClose = TRUE;
246+
st_HDRParam.nHttpCode = 404;
247+
248+
RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
249+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
250+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError());
251+
return FALSE;
252+
}
253+
}
191254
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd);
192255
return TRUE;
193256
}

XEngine_Source/XEngine_StorageApp/StorageApp_Download.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam);
44
XHTHREAD CALLBACK XEngine_Download_SendThread(LPVOID lParam);
5+
void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam);
56

67
BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount);
78
BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen);

XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ int main(int argc, char** argv)
268268
goto XENGINE_EXITAPP;
269269
}
270270
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动用户管理服务成功"));
271-
if (!Session_DLStroage_Init(st_ServiceCfg.st_XMax.nStorageDLThread, st_ServiceCfg.st_XLimit.nDLTry, st_ServiceCfg.st_XLimit.nDLError))
271+
if (!Session_DLStroage_Init(1 == st_ServiceCfg.st_XStorage.nSendMode ? st_ServiceCfg.st_XMax.nStorageDLThread : 1, st_ServiceCfg.st_XLimit.nDLTry, st_ServiceCfg.st_XLimit.nDLError))
272272
{
273273
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务器中,启动下载会话服务失败,错误:%lX"), Session_GetLastError());
274274
goto XENGINE_EXITAPP;
@@ -339,12 +339,19 @@ int main(int argc, char** argv)
339339
goto XENGINE_EXITAPP;
340340
}
341341
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动HTTP下载任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread);
342-
if (!ManagePool_Thread_NQCreate(&xhSDPool, &ppSt_ListSDThread, st_ServiceCfg.st_XMax.nStorageDLThread))
342+
if (1 == st_ServiceCfg.st_XStorage.nSendMode)
343343
{
344-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动下载任务线程池失败,错误:%d"), errno);
345-
goto XENGINE_EXITAPP;
344+
if (!ManagePool_Thread_NQCreate(&xhSDPool, &ppSt_ListSDThread, st_ServiceCfg.st_XMax.nStorageDLThread))
345+
{
346+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动下载任务线程池失败,错误:%d"), errno);
347+
goto XENGINE_EXITAPP;
348+
}
349+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动下载任务线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread);
350+
}
351+
else
352+
{
353+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,使用发送回调模式处理下载"));
346354
}
347-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动下载任务线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread);
348355

349356
for (int i = 0; i < st_ServiceCfg.st_XMax.nStorageUPThread; i++)
350357
{

0 commit comments

Comments
 (0)