Commit 9ebb853d by NitefullWind

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

parent de68aeab
......@@ -3,6 +3,7 @@
#include "stdafx.h"
#include "fm_log.h"
#include "fmerror.h"
#include "send.h"
#include "recv.h"
......@@ -11,10 +12,6 @@
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define SERVERIP "127.0.0.1"
//#define SERVERIP "172.16.13.87"
#define SERVERPORT 23770
#define MakeError(msg, ...) \
strset(ErrorMsg, 0); \
sprintf(ErrorMsg, msg, __VA_ARGS__); \
......@@ -22,9 +19,8 @@
LOG() << ErrorMsg; \
isOk = false;
extern "C" {
__declspec(dllexport) int __stdcall FMGetResponse(const char* req, char* rsp, unsigned int byteSize)
{
extern "C" __declspec(dllexport) int __stdcall FMGetResponse(const char* req, char* rsp, unsigned int byteSize)
{
WSADATA wsa;
SOCKET _socket;
struct sockaddr_in _server;
......@@ -36,30 +32,29 @@ extern "C" {
//Log("Initialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
MakeError("Error. Startup error: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
MakeError("Error. Startup error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
}
if(isOk && (_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
MakeError("Could not create socket: %d. Server: %s, Port: %d", WSAGetLastError(), SERVERIP, SERVERPORT)
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(SERVERIP);
_server.sin_addr.S_un.S_addr = (ULONG)inet_addr(setting.ip.c_str());
_server.sin_family = AF_INET;
_server.sin_port = htons(SERVERPORT);
_server.sin_port = htons(setting.port);
setsockopt(_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&sendTimeOut, sizeof(int));
setsockopt(_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&recvTimeOut, sizeof(int));
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(), SERVERIP, SERVERPORT)
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(), SERVERIP, SERVERPORT)
MakeError("Error. Send error: %d. Server: %s, Port: %d", WSAGetLastError(), setting.ip.c_str(), setting.port)
}
if (isOk) {
LOG() << "Send data: " << req;
......@@ -71,13 +66,13 @@ extern "C" {
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)
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(), SERVERIP, SERVERPORT)
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(), SERVERIP, SERVERPORT)
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(), SERVERIP, SERVERPORT)
MakeError("Error. %s. Server: %s, Port: %d", FMError_BufferOverflow.MsgCStr(), setting.ip.c_str(), setting.port)
}
if (isOk) {
......@@ -91,5 +86,4 @@ extern "C" {
WSACleanup();
return recv_size;
}
}
\ No newline at end of file
#ifndef FM_LOG_H
#define FM_LOG_H
#include "stdafx.h"
#include "fm_tool.h"
#include <time.h>
......@@ -23,7 +24,7 @@ public :
fm_tool::GetProcPath(filepath);
Get_LOG_FileName();
filepath.append("fmdlllog\\");
filepath.append(setting.logPath);
mkdir(filepath.c_str());
filepath.append(_curr_filename);
filepath.append(".txt");
......
#pragma once
#include "stdafx.h"
#include "fm_log.h"
#include "socketHeader.h"
int _Recv(SOCKET socket, char *ptr, int length)
......@@ -44,22 +45,22 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
memcpy(recvBuf+totalLen, tempBuf, tempLen); // 临时数据拷贝到接收数据
totalLen += tempLen;
//! 如果需要接受消息头
#ifdef NeedSocketHeaderRecv
//! 如果需要接受消息头
if(setting.needSocketHeaderRecv) {
if(needLen == -1 && totalLen >= sizeof(FMSOCKHEADER)) { // 消息头接收完成
FMSOCKHEADER header = {0,0,0};
memcpy(&header, recvBuf, sizeof(FMSOCKHEADER));
if(header.flag != FMHEADERFLAG) {
//! 如果兼容接收没有消息头或消息头不对的数据,则不终止程序
#ifdef NoHeaderCompatible
//! 如果兼容接收没有消息头或消息头不对的数据,则不终止程序
if(setting.noHeaderCompatible) {
needLen = totalLen;
dataLen = totalLen;
#else // NoHeaderCompatible
} else {
delete[] recvBuf;
delete[] tempBuf;
return FMError_IncorrectHeader.Code(); // 消息头不符
#endif // NoHeaderCompatible
}
} else {
needLen = header.len + sizeof(FMSOCKHEADER); // 设置实际需要接收长度
......@@ -73,7 +74,7 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
return FMError_BufferOverflow.Code();
}
}
#else // NeedSocketHeaderRecv
} else {
needLen = totalLen;
dataLen = totalLen;
if (byteSize < dataLen) { // 判断接收Buffer长度是否足够
......@@ -81,7 +82,7 @@ int Recv(SOCKET socket, char *ptr, unsigned int byteSize)
delete[] tempBuf;
return FMError_BufferOverflow.Code();
}
#endif // NeedSocketHeaderRecv
}
}
memcpy(ptr, recvBuf+needLen-dataLen, needLen);
......@@ -95,8 +96,6 @@ static int read_cnt;
static char *read_ptr;
static char read_buf[MAX_SIZE];
const int FM_ERROR_CODE_SOCKET = -1;
static int my_read(int fd, char *ptr)
{
if (read_cnt <= 0) {
......
#pragma once
#include "stdafx.h"
#include "fm_log.h"
#include "socketHeader.h"
int Send(SOCKET socket, const char *ptr)
{
char *sendData = (char*)ptr;
int sendLength = strlen(ptr);
#ifdef NeedSocketHeaderSend
char *addHeaderData;
if(setting.needSocketHeaderSend)
{
int addHeaderDataLength = GetAddHeaderReqDataLength(ptr);
char *addHeaderData = new char[addHeaderDataLength];
addHeaderData = new char[addHeaderDataLength];
GetAddHeaderReqData(ptr, addHeaderData, addHeaderDataLength);
sendData = (char*)addHeaderData;
sendLength = addHeaderDataLength;
#endif
}
int tempLen = -1;
if( (tempLen = send(socket, sendData, sendLength, 0)) < 0) {
LOG() << "Error: other error.";
}
#ifdef NeedSocketHeaderSend
if(setting.needSocketHeaderSend) {
delete[] addHeaderData;
#endif
}
return tempLen;
}
\ No newline at end of file
......@@ -6,3 +6,39 @@
// 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 @@
#include <winsock2.h>
#include <Windows.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[20480] = {0};sprintf(msg, _Format, __VA_ARGS__);LOG() << msg;}
const int MAX_SIZE = 4096;
// 设置超时时间
const int sendTimeOut = 0.5 * 60 * 1000;
const int recvTimeOut = 2 * 60 * 1000;
#define NeedSocketHeaderSend
#define NeedSocketHeaderRecv
#define NoHeaderCompatible // 是否兼容接收没有消息头的数据
extern FMSetting setting;
const int FM_ERROR_CODE_SOCKET = -1;
static const Freemud::Error FMError_Success(100, "Success.");
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_IncorrectHeader(-3, "Incorrect socket's header.");
static const Freemud::Error FMError_BufferOverflow(-4, "Buffer overflow.");
......@@ -5,7 +5,7 @@
#include <string>
#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[])
{
......
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