Commit e6642d71 by NitefullWind

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

parent 720cf5c9
......@@ -23,7 +23,7 @@
isOk = false;
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;
SOCKET _socket;
......
No preview for this file type
......@@ -43,28 +43,37 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
memcpy(recvBuf+totalLen, tempBuf, tempLen); // 临时数据拷贝到接收数据
totalLen += tempLen;
//! 如果需要接受消息头
#ifdef NeedSocketHeaderRecv
if(needLen == -1 && totalLen >= sizeof(FMSOCKHEADER)) { // 如果消息头接收完成
if(needLen == -1 && totalLen >= sizeof(FMSOCKHEADER)) { // 消息头接收完成
FMSOCKHEADER header = {0,0,0};
memcpy(&header, recvBuf, sizeof(FMSOCKHEADER));
if(header.flag != FMHEADERFLAG) {
//! 如果兼容接收没有消息头或消息头不对的数据,则不终止程序
#ifdef NoHeaderCompatible
needLen = totalLen;
dataLen = totalLen;
#else // NoHeaderCompatible
delete[] recvBuf;
delete[] tempBuf;
return FMError_IncorrectHeader.Code(); // 消息头不符
#endif // NoHeaderCompatible
} else {
needLen = header.len + sizeof(FMSOCKHEADER); // 设置实际需要接收长度
dataLen = header.len;
}
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
Log("Error. Buffer overflow, Except size: %d, Actual size: %d", byteSize, dataLen);
delete[] recvBuf;
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
Log("Error. Buffer overflow, Except size: %d, Actual size: %d", byteSize, dataLen);
delete[] recvBuf;
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
}
#else
#else // NeedSocketHeaderRecv
needLen = totalLen;
dataLen = totalLen;
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
......@@ -72,14 +81,10 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
#endif
#endif // NeedSocketHeaderRecv
}
#ifdef NeedSocketHeaderRecv
memcpy(ptr, recvBuf+sizeof(FMSOCKHEADER), dataLen);
#else
memcpy(ptr, recvBuf, needLen);
#endif
memcpy(ptr, recvBuf+needLen-dataLen, needLen);
delete[] recvBuf;
delete[] tempBuf;
......
......@@ -28,12 +28,9 @@ const int MAX_SIZE = 4096;
const int sendTimeOut = 0.5 * 60 * 1000;
const int recvTimeOut = 2 * 60 * 1000;
#ifndef NeedSocketHeaderSend
#define NeedSocketHeaderSend
#endif
#ifndef NeedSocketHeaderRecv
#define NeedSocketHeaderRecv
#endif
#define NoHeaderCompatible // 是否兼容接收没有消息头的数据
static const Freemud::Error FMError_Success(100, "Success.");
static const Freemud::Error FMError_ConnectClosed(0, "Connection closed.");
......
......@@ -5,10 +5,8 @@
#include <string>
#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[])
{
HMODULE hdll = LoadLibraryA("FreemudAPI.dll");
......@@ -72,10 +70,13 @@ int _tmain(int argc, _TCHAR* argv[])
infile.close();
}
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("retcode: %d", ret);
printf("\n%s\n", out);
printf("\n======================================================================\n");
}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