Commit 9ebb853d by NitefullWind

1. 实现可配置ip、端口、是否需要消息头等。

parent de68aeab
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "fm_log.h"
#include "fmerror.h" #include "fmerror.h"
#include "send.h" #include "send.h"
#include "recv.h" #include "recv.h"
...@@ -11,10 +12,6 @@ ...@@ -11,10 +12,6 @@
#define _WINSOCK_DEPRECATED_NO_WARNINGS #define _WINSOCK_DEPRECATED_NO_WARNINGS
#define SERVERIP "127.0.0.1"
//#define SERVERIP "172.16.13.87"
#define SERVERPORT 23770
#define MakeError(msg, ...) \ #define MakeError(msg, ...) \
strset(ErrorMsg, 0); \ strset(ErrorMsg, 0); \
sprintf(ErrorMsg, msg, __VA_ARGS__); \ sprintf(ErrorMsg, msg, __VA_ARGS__); \
...@@ -22,74 +19,71 @@ ...@@ -22,74 +19,71 @@
LOG() << ErrorMsg; \ LOG() << ErrorMsg; \
isOk = false; isOk = false;
extern "C" { extern "C" __declspec(dllexport) int __stdcall 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;
struct sockaddr_in _server;
bool isOk = true;
Freemud::Error _error;
char ErrorMsg[2048] = {0};
//Log("Initialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{ {
WSADATA wsa; MakeError("Error. Startup error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
SOCKET _socket;
struct sockaddr_in _server;
bool isOk = true;
Freemud::Error _error;
char ErrorMsg[2048] = {0};
//Log("Initialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
MakeError("Error. Startup error: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
}
if(isOk && (_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
MakeError("Could not create socket: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
}
_server.sin_addr.S_un.S_addr = (ULONG)inet_addr(SERVERIP);
_server.sin_family = AF_INET;
_server.sin_port = htons(SERVERPORT);
setsockopt(_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&sendTimeOut, sizeof(int));
setsockopt(_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&recvTimeOut, sizeof(int));
if (isOk && connect(_socket, (struct sockaddr *)&_server, sizeof(_server)) < 0)
{
MakeError("Error. connect error: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
}
//if (isOk && send(_socket, req, strlen(req), 0) < 0)
if (isOk && Send(_socket, req) < 0)
{
MakeError("Error. Send error: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
}
if (isOk) {
LOG() << "Send data: " << req;
}
int recv_size = SOCKET_ERROR;
//if (isOk && (recv_size = recv(_socket, rsp, 40960, 0)) == SOCKET_ERROR)
//if (isOk && (recv_size = readline(_socket, rsp, 40960)) == SOCKET_ERROR)
memset(rsp, 0, byteSize);
if (isOk && (recv_size = Recv(_socket, rsp, byteSize-1)) == SOCKET_ERROR)
{
MakeError("Error. Recv error: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
} else if(recv_size == FMError_ConnectClosed.Code()) {
MakeError("Error. %s(%d). Server: %s, Port: %d", FMError_ConnectClosed.MsgCStr(), WSAGetLastError(), SERVERIP, SERVERPORT)
} else if(recv_size == FMError_IncorrectHeader.Code()) {
MakeError("Error. %s. Server: %s, Port: %d", FMError_IncorrectHeader.MsgCStr(), SERVERIP, SERVERPORT)
} else if(recv_size == FMError_BufferOverflow.Code()) {
MakeError("Error. %s. Server: %s, Port: %d", FMError_BufferOverflow.MsgCStr(), SERVERIP, SERVERPORT)
}
if (isOk) {
LOG() << "Recv size: " << recv_size << " Recv data: " << rsp;
} else if (_error.Code() == FM_ERROR_CODE_SOCKET) {
sprintf(ErrorMsg, "{\"statusCode\": 104, \"msg\": \"本地Socket通讯错误(%s).\"}", _error.Msg().c_str());
strcpy(rsp, ErrorMsg);
}
closesocket(_socket);
WSACleanup();
return recv_size;
} }
if(isOk && (_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
MakeError("Could not create socket: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
}
_server.sin_addr.S_un.S_addr = (ULONG)inet_addr(setting.ip.c_str());
_server.sin_family = AF_INET;
_server.sin_port = htons(setting.port);
setsockopt(_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&setting.timeOutSend, sizeof(int));
setsockopt(_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&setting.timeOutRecv, sizeof(int));
if (isOk && connect(_socket, (struct sockaddr *)&_server, sizeof(_server)) < 0)
{
MakeError("Error. connect error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
}
//if (isOk && send(_socket, req, strlen(req), 0) < 0)
if (isOk && Send(_socket, req) < 0)
{
MakeError("Error. Send error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
}
if (isOk) {
LOG() << "Send data: " << req;
}
int recv_size = SOCKET_ERROR;
//if (isOk && (recv_size = recv(_socket, rsp, 40960, 0)) == SOCKET_ERROR)
//if (isOk && (recv_size = readline(_socket, rsp, 40960)) == SOCKET_ERROR)
memset(rsp, 0, byteSize);
if (isOk && (recv_size = Recv(_socket, rsp, byteSize-1)) == SOCKET_ERROR)
{
MakeError("Error. Recv error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
} else if(recv_size == FMError_ConnectClosed.Code()) {
MakeError("Error. %s(%d). Server: %s, Port: %d", FMError_ConnectClosed.MsgCStr(), WSAGetLastError(), setting.ip.c_str(), setting.port)
} else if(recv_size == FMError_IncorrectHeader.Code()) {
MakeError("Error. %s. Server: %s, Port: %d", FMError_IncorrectHeader.MsgCStr(), setting.ip.c_str(), setting.port)
} else if(recv_size == FMError_BufferOverflow.Code()) {
MakeError("Error. %s. Server: %s, Port: %d", FMError_BufferOverflow.MsgCStr(), setting.ip.c_str(), setting.port)
}
if (isOk) {
LOG() << "Recv size: " << recv_size << " Recv data: " << rsp;
} else if (_error.Code() == FM_ERROR_CODE_SOCKET) {
sprintf(ErrorMsg, "{\"statusCode\": 104, \"msg\": \"本地Socket通讯错误(%s).\"}", _error.Msg().c_str());
strcpy(rsp, ErrorMsg);
}
closesocket(_socket);
WSACleanup();
return recv_size;
} }
\ No newline at end of file
#ifndef FM_LOG_H #ifndef FM_LOG_H
#define FM_LOG_H #define FM_LOG_H
#include "stdafx.h"
#include "fm_tool.h" #include "fm_tool.h"
#include <time.h> #include <time.h>
...@@ -23,7 +24,7 @@ public : ...@@ -23,7 +24,7 @@ public :
fm_tool::GetProcPath(filepath); fm_tool::GetProcPath(filepath);
Get_LOG_FileName(); Get_LOG_FileName();
filepath.append("fmdlllog\\"); filepath.append(setting.logPath);
mkdir(filepath.c_str()); mkdir(filepath.c_str());
filepath.append(_curr_filename); filepath.append(_curr_filename);
filepath.append(".txt"); filepath.append(".txt");
......
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "fm_log.h"
#include "socketHeader.h" #include "socketHeader.h"
int _Recv(SOCKET socket, char *ptr, int length) int _Recv(SOCKET socket, char *ptr, int length)
...@@ -44,44 +45,44 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize) ...@@ -44,44 +45,44 @@ 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 if(setting.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 if(setting.noHeaderCompatible) {
needLen = totalLen; needLen = totalLen;
dataLen = totalLen; dataLen = totalLen;
#else // NoHeaderCompatible } else {
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长度是否足够
LOG() << "Error. Buffer overflow, Except size: " << byteSize << " Actual size: " << dataLen;
delete[] recvBuf;
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
} }
} else {
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够 needLen = totalLen;
LOG() << "Error. Buffer overflow, Except size: " << byteSize << " Actual size: " << dataLen; dataLen = totalLen;
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
delete[] recvBuf; delete[] recvBuf;
delete[] tempBuf; delete[] tempBuf;
return FMError_BufferOverflow.Code(); return FMError_BufferOverflow.Code();
} }
} }
#else // NeedSocketHeaderRecv
needLen = totalLen;
dataLen = totalLen;
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
delete[] recvBuf;
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
#endif // NeedSocketHeaderRecv
} }
memcpy(ptr, recvBuf+needLen-dataLen, needLen); memcpy(ptr, recvBuf+needLen-dataLen, needLen);
...@@ -95,8 +96,6 @@ static int read_cnt; ...@@ -95,8 +96,6 @@ static int read_cnt;
static char *read_ptr; static char *read_ptr;
static char read_buf[MAX_SIZE]; static char read_buf[MAX_SIZE];
const int FM_ERROR_CODE_SOCKET = -1;
static int my_read(int fd, char *ptr) static int my_read(int fd, char *ptr)
{ {
if (read_cnt <= 0) { if (read_cnt <= 0) {
......
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "fm_log.h"
#include "socketHeader.h" #include "socketHeader.h"
int Send(SOCKET socket, const char *ptr) int Send(SOCKET socket, const char *ptr)
{ {
char *sendData = (char*)ptr; char *sendData = (char*)ptr;
int sendLength = strlen(ptr); int sendLength = strlen(ptr);
#ifdef NeedSocketHeaderSend char *addHeaderData;
int addHeaderDataLength = GetAddHeaderReqDataLength(ptr); if(setting.needSocketHeaderSend)
char *addHeaderData = new char[addHeaderDataLength]; {
GetAddHeaderReqData(ptr, addHeaderData, addHeaderDataLength); int addHeaderDataLength = GetAddHeaderReqDataLength(ptr);
sendData = (char*)addHeaderData; addHeaderData = new char[addHeaderDataLength];
sendLength = addHeaderDataLength; GetAddHeaderReqData(ptr, addHeaderData, addHeaderDataLength);
#endif sendData = (char*)addHeaderData;
sendLength = addHeaderDataLength;
}
int tempLen = -1; int tempLen = -1;
if( (tempLen = send(socket, sendData, sendLength, 0)) < 0) { if( (tempLen = send(socket, sendData, sendLength, 0)) < 0) {
LOG() << "Error: other error."; LOG() << "Error: other error.";
} }
#ifdef NeedSocketHeaderSend if(setting.needSocketHeaderSend) {
delete[] addHeaderData; delete[] addHeaderData;
#endif }
return tempLen; return tempLen;
} }
\ No newline at end of file
...@@ -6,3 +6,39 @@ ...@@ -6,3 +6,39 @@
// TODO: 在 STDAFX.H 中 // TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用 // 引用任何所需的附加头文件,而不是在此文件中引用
FMSetting::FMSetting()
{
fm_tool::GetProcPath(this->settingPath);
this->settingPath.append("FreemudAPI.ini");
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_IP, this->ip);
std::string tempStr = "23770";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_Port, tempStr);
this->port = atoi(tempStr.c_str());
tempStr = "1";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_NeedSocketHeaderSend, tempStr);
this->needSocketHeaderSend = (atoi(tempStr.c_str()) != 0);
tempStr = "1";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_NeedSocketHeaderRecv, tempStr);
this->needSocketHeaderRecv = (atoi(tempStr.c_str()) != 0);
tempStr = "1";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_NoHeaderCompatible, tempStr);
this->noHeaderCompatible = (atoi(tempStr.c_str()) != 0);
tempStr = "60";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_TimeOutSend, tempStr);
this->timeOutSend = atoi(tempStr.c_str());
tempStr = "120";
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Server, SETTING_TimeOutRecv, tempStr);
this->timeOutRecv = atoi(tempStr.c_str());
fm_tool::ReadTMPForType(this->settingPath, SETTING_SESSION_Log, SETTING_Path, this->logPath);
};
FMSetting setting = FMSetting();
\ No newline at end of file
...@@ -18,23 +18,45 @@ ...@@ -18,23 +18,45 @@
#include <winsock2.h> #include <winsock2.h>
#include <Windows.h> #include <Windows.h>
#include "fmerror.h" #include "fmerror.h"
#include "fm_log.h" #include "fm_tool.h"
struct FMSetting
{
#define SETTING_SESSION_Server "Server"
#define SETTING_SESSION_Log "Log"
#define SETTING_IP "IP"
#define SETTING_Port "Port"
#define SETTING_NeedSocketHeaderSend "setting.needSocketHeaderSend"
#define SETTING_NeedSocketHeaderRecv "setting.needSocketHeaderRecv"
#define SETTING_NoHeaderCompatible "setting.noHeaderCompatible"
#define SETTING_TimeOutSend "TimeOutSend"
#define SETTING_TimeOutRecv "TimeOutRecv"
#define SETTING_Path "Path"
FMSetting();
std::string settingPath;
std::string ip;
int port;
bool needSocketHeaderSend;
bool needSocketHeaderRecv;
bool noHeaderCompatible;
int timeOutSend;
int timeOutRecv;
std::string logPath;
};
//#define Log(_Format, ...) {char msg[1024] = {0}; printf("Function:%s, Line:%d: ", __FUNCTION__, __LINE__); printf(_Format, __VA_ARGS__); printf("\n");} //#define Log(_Format, ...) {char msg[1024] = {0}; printf("Function:%s, Line:%d: ", __FUNCTION__, __LINE__); printf(_Format, __VA_ARGS__); printf("\n");}
//#define Log(_Format, ...) {char msg[20480] = {0};sprintf(msg, _Format, __VA_ARGS__);LOG() << msg;} //#define Log(_Format, ...) {char msg[20480] = {0};sprintf(msg, _Format, __VA_ARGS__);LOG() << msg;}
const int MAX_SIZE = 4096; const int MAX_SIZE = 4096;
// 设置超时时间
const int sendTimeOut = 0.5 * 60 * 1000;
const int recvTimeOut = 2 * 60 * 1000;
#define NeedSocketHeaderSend extern FMSetting setting;
#define NeedSocketHeaderRecv
#define NoHeaderCompatible // 是否兼容接收没有消息头的数据 const int FM_ERROR_CODE_SOCKET = -1;
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.");
static const Freemud::Error FMError_SocketError(-1, "Socket error."); static const Freemud::Error FMError_SocketError(FM_ERROR_CODE_SOCKET, "Socket error.");
static const Freemud::Error FMError_ConnectTimeout(-2, "Connection timeout."); static const Freemud::Error FMError_ConnectTimeout(-2, "Connection timeout.");
static const Freemud::Error FMError_IncorrectHeader(-3, "Incorrect socket's header."); static const Freemud::Error FMError_IncorrectHeader(-3, "Incorrect socket's header.");
static const Freemud::Error FMError_BufferOverflow(-4, "Buffer overflow."); static const Freemud::Error FMError_BufferOverflow(-4, "Buffer overflow.");
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <string> #include <string>
#include <fstream> #include <fstream>
typedef int (__stdcall *FMGetResponse)(const char* req, char* rsp, unsigned int byteSize); EXTERN_C typedef int (__stdcall *FMGetResponse)(const char* req, char* rsp, unsigned int byteSize);
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
......
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