Commit e6642d71 by NitefullWind

1. 导出函数声明使用__stdcall修饰。 2. 接收函数兼容接收不带消息头的数据。

parent 720cf5c9
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
isOk = false; isOk = false;
extern "C" { extern "C" {
__declspec(dllexport) int FMGetResponse(const char* req, char* rsp, unsigned int byteSize) __declspec(dllexport) int __stdcall FMGetResponse(const char* req, char* rsp, unsigned int byteSize)
{ {
WSADATA wsa; WSADATA wsa;
SOCKET _socket; SOCKET _socket;
......
No preview for this file type
...@@ -44,17 +44,27 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize) ...@@ -44,17 +44,27 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
memcpy(recvBuf+totalLen, tempBuf, tempLen); // 临时数据拷贝到接收数据 memcpy(recvBuf+totalLen, tempBuf, tempLen); // 临时数据拷贝到接收数据
totalLen += tempLen; totalLen += tempLen;
//! 如果需要接受消息头
#ifdef NeedSocketHeaderRecv #ifdef NeedSocketHeaderRecv
if(needLen == -1 && totalLen >= sizeof(FMSOCKHEADER)) { // 如果消息头接收完成 if(needLen == -1 && totalLen >= sizeof(FMSOCKHEADER)) { // 消息头接收完成
FMSOCKHEADER header = {0,0,0}; FMSOCKHEADER header = {0,0,0};
memcpy(&header, recvBuf, sizeof(FMSOCKHEADER)); memcpy(&header, recvBuf, sizeof(FMSOCKHEADER));
if(header.flag != FMHEADERFLAG) { if(header.flag != FMHEADERFLAG) {
//! 如果兼容接收没有消息头或消息头不对的数据,则不终止程序
#ifdef NoHeaderCompatible
needLen = totalLen;
dataLen = totalLen;
#else // NoHeaderCompatible
delete[] recvBuf; delete[] recvBuf;
delete[] tempBuf; delete[] tempBuf;
return FMError_IncorrectHeader.Code(); // 消息头不符 return FMError_IncorrectHeader.Code(); // 消息头不符
#endif // NoHeaderCompatible
} else { } else {
needLen = header.len + sizeof(FMSOCKHEADER); // 设置实际需要接收长度 needLen = header.len + sizeof(FMSOCKHEADER); // 设置实际需要接收长度
dataLen = header.len; dataLen = header.len;
}
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够 if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
Log("Error. Buffer overflow, Except size: %d, Actual size: %d", byteSize, dataLen); Log("Error. Buffer overflow, Except size: %d, Actual size: %d", byteSize, dataLen);
...@@ -63,8 +73,7 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize) ...@@ -63,8 +73,7 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
return FMError_BufferOverflow.Code(); return FMError_BufferOverflow.Code();
} }
} }
} #else // NeedSocketHeaderRecv
#else
needLen = totalLen; needLen = totalLen;
dataLen = totalLen; dataLen = totalLen;
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够 if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
...@@ -72,14 +81,10 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize) ...@@ -72,14 +81,10 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
delete[] tempBuf; delete[] tempBuf;
return FMError_BufferOverflow.Code(); return FMError_BufferOverflow.Code();
} }
#endif #endif // NeedSocketHeaderRecv
} }
#ifdef NeedSocketHeaderRecv memcpy(ptr, recvBuf+needLen-dataLen, needLen);
memcpy(ptr, recvBuf+sizeof(FMSOCKHEADER), dataLen);
#else
memcpy(ptr, recvBuf, needLen);
#endif
delete[] recvBuf; delete[] recvBuf;
delete[] tempBuf; delete[] tempBuf;
......
...@@ -28,12 +28,9 @@ const int MAX_SIZE = 4096; ...@@ -28,12 +28,9 @@ const int MAX_SIZE = 4096;
const int sendTimeOut = 0.5 * 60 * 1000; const int sendTimeOut = 0.5 * 60 * 1000;
const int recvTimeOut = 2 * 60 * 1000; const int recvTimeOut = 2 * 60 * 1000;
#ifndef NeedSocketHeaderSend
#define NeedSocketHeaderSend #define NeedSocketHeaderSend
#endif
#ifndef NeedSocketHeaderRecv
#define NeedSocketHeaderRecv #define NeedSocketHeaderRecv
#endif #define NoHeaderCompatible // 是否兼容接收没有消息头的数据
static const Freemud::Error FMError_Success(100, "Success."); static const Freemud::Error FMError_Success(100, "Success.");
static const Freemud::Error FMError_ConnectClosed(0, "Connection closed."); static const Freemud::Error FMError_ConnectClosed(0, "Connection closed.");
......
...@@ -5,10 +5,8 @@ ...@@ -5,10 +5,8 @@
#include <string> #include <string>
#include <fstream> #include <fstream>
typedef int (*FMGetResponse)(const char* req, char* rsp, unsigned int byteSize); typedef int (__stdcall *FMGetResponse)(const char* req, char* rsp, unsigned int byteSize);
const unsigned int outSize = 1024*1024+1;
char out[outSize] = { 0 };
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
HMODULE hdll = LoadLibraryA("FreemudAPI.dll"); HMODULE hdll = LoadLibraryA("FreemudAPI.dll");
...@@ -73,9 +71,12 @@ int _tmain(int argc, _TCHAR* argv[]) ...@@ -73,9 +71,12 @@ int _tmain(int argc, _TCHAR* argv[])
} }
printf("Get in data: %s\n", inStr.data()); printf("Get in data: %s\n", inStr.data());
fmFunc(inStr.data(), out, outSize); const unsigned int outSize = 1024*100+1;
char out[outSize] = { 0 };
int ret = fmFunc(inStr.c_str(), out, outSize);
printf("========================================================================\n"); printf("========================================================================\n");
printf("retcode: %d", ret);
printf("\n%s\n", out); printf("\n%s\n", out);
printf("\n======================================================================\n"); printf("\n======================================================================\n");
}while(true); }while(true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment