Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
FreemudAPI
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhenfei.zhang
FreemudAPI
Commits
9ebb853d
Commit
9ebb853d
authored
Feb 24, 2018
by
NitefullWind
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1. 实现可配置ip、端口、是否需要消息头等。
parent
de68aeab
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
104 additions
and
47 deletions
+104
-47
FreemudAPI/FreemudAPI.cpp
+15
-22
FreemudAPI/fm_log.h
+2
-1
FreemudAPI/recv.h
+9
-10
FreemudAPI/send.h
+10
-5
FreemudAPI/stdafx.cpp
+37
-0
FreemudAPI/stdafx.h
+30
-8
test/test.cpp
+1
-1
No files found.
FreemudAPI/FreemudAPI.cpp
View file @
9ebb853d
...
...
@@ -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
FreemudAPI/fm_log.h
View file @
9ebb853d
#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"
);
...
...
FreemudAPI/recv.h
View file @
9ebb853d
#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
)
{
...
...
FreemudAPI/send.h
View file @
9ebb853d
#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
FreemudAPI/stdafx.cpp
View file @
9ebb853d
...
...
@@ -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
FreemudAPI/stdafx.h
View file @
9ebb853d
...
...
@@ -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."
);
test/test.cpp
View file @
9ebb853d
...
...
@@ -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
[])
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment