Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
FMVip_Today
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
FMVip_Today
Commits
daf2cd68
Commit
daf2cd68
authored
Sep 17, 2016
by
Carwyn
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixes: 1.接收完成判断不正确导致的 socket 阻塞问题
parent
68a7e05d
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
18 additions
and
23 deletions
+18
-23
FMVipDC/fmapirelay.cpp
+1
-0
FMVipDC/fmsockserver.cpp
+17
-23
No files found.
FMVipDC/fmapirelay.cpp
View file @
daf2cd68
...
...
@@ -43,6 +43,7 @@ INT FMApiRelay::_ParseRequest(LPSTR data)
json
.
Parse
(
data
);
if
(
json
.
IsNull
()
||
json
.
HasParseError
())
{
FMLOG
(
"Bad json data."
);
return
FM_API_BADJSON
;
}
...
...
FMVipDC/fmsockserver.cpp
View file @
daf2cd68
...
...
@@ -150,9 +150,9 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
HeapFree
(
GetProcessHeap
(),
0
,
io_data
);
return
;
}
FMLOG
(
_T
(
"Received bytes: %ld."
),
io_data
->
offset
+
bytes
);
UINT
data_len
=
io_data
->
offset
+
bytes
;
FMLOG
(
_T
(
"Socket %d received bytes: %ld."
),
io_data
->
socket
,
data_len
);
UINT
data_len
=
strlen
(
io_data
->
msg
);
if
(
io_data
->
header
.
flag
==
FMSOCKFLAG
)
{
if
(
err
!=
0
||
bytes
==
0
)
{
//! Connection was closed by client
...
...
@@ -161,14 +161,15 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
}
else
if
(
data_len
<
io_data
->
header
.
len
)
{
//! Receive data
if
(
data_len
==
0
)
{
if
(
strlen
(
io_data
->
msg
)
==
0
)
{
FMLOG
(
_T
(
"Legal header. Starts receiving data."
));
LPFMSOCKDATA
io_new_data
=
NULL
;
UINT
len
=
sizeof
(
FMSOCKDATA
)
+
io_data
->
header
.
len
;
io_new_data
=
(
LPFMSOCKDATA
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
len
);
io_new_data
->
buffer
=
io_data
->
buffer
;
io_new_data
->
buffer
.
len
=
io_data
->
header
.
len
;
io_new_data
->
buffer
.
buf
=
io_new_data
->
msg
+
io_new_data
->
offset
;
io_new_data
->
buffer
.
buf
=
io_new_data
->
msg
;
io_new_data
->
socket
=
io_data
->
socket
;
io_new_data
->
relay
=
io_data
->
relay
;
...
...
@@ -182,14 +183,18 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
FMLOG
(
_T
(
"Rewaiting for new data(offset: %ld)I/O completion..."
),
io_new_data
->
offset
);
res
=
SleepEx
(
1000
,
TRUE
);
}
//! Free header buffer
HeapFree
(
GetProcessHeap
(),
0
,
io_data
);
}
else
{
FMLOG
(
_T
(
"Received data %ld bytes..."
),
bytes
);
io_data
->
offset
+=
bytes
;
io_data
->
buffer
.
len
=
io_data
->
header
.
len
-
io_data
->
offset
;
io_data
->
buffer
.
buf
=
io_data
->
msg
+
io_data
->
offset
;
io_data
->
offset
+=
bytes
;
WSARecv
(
io_data
->
socket
,
&
io_data
->
buffer
,
1
,
NULL
,
&
io_data
->
flags
,
&
io_data
->
overlap
,
FMSockServer
::
RecvRoutine
);
DWORD
res
=
SleepEx
(
1000
,
TRUE
);
while
(
res
!=
WAIT_IO_COMPLETION
)
{
while
(
res
!=
WAIT_IO_COMPLETION
&&
io_data
->
offset
<
io_data
->
header
.
len
)
{
FMLOG
(
_T
(
"Rewaiting for old data(offset: %ld)I/O completion..."
),
io_data
->
offset
);
res
=
SleepEx
(
1000
,
TRUE
);
}
...
...
@@ -197,8 +202,9 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
}
else
{
//! Legal freemud api data
FMLOG
(
"All data received: %s"
,
io_data
->
msg
);
io_data
->
msg
[
bytes
]
=
'\0'
;
FMLOG
(
_T
(
"Received data %ld bytes."
),
bytes
);
io_data
->
offset
+=
bytes
;
io_data
->
msg
[
io_data
->
offset
]
=
'\0'
;
char
*
response
=
NULL
;
UINT
len
=
0
;
if
(
io_data
->
relay
)
{
...
...
@@ -207,31 +213,19 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
if
(
response
)
{
send
(
io_data
->
socket
,
response
,
len
,
0
);
LPFMSOCKDATA
io_new_data
=
NULL
;
io_new_data
=
(
LPFMSOCKDATA
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
FMSOCKDATA
));
//! Receive length first
io_new_data
->
buffer
.
len
=
sizeof
(
io_new_data
->
header
);
io_new_data
->
buffer
.
buf
=
(
char
*
)
&
io_new_data
->
header
;
io_new_data
->
relay
=
io_data
->
relay
;
io_new_data
->
socket
=
io_data
->
socket
;
WSARecv
(
io_new_data
->
socket
,
&
io_new_data
->
buffer
,
1
,
NULL
,
&
io_new_data
->
flags
,
&
io_new_data
->
overlap
,
FMSockServer
::
RecvRoutine
);
DWORD
res
=
SleepEx
(
1000
,
TRUE
);
while
(
res
!=
WAIT_IO_COMPLETION
)
{
FMLOG
(
_T
(
"Rewaiting send for I/O completion..."
));
res
=
SleepEx
(
1000
,
TRUE
);
}
}
else
{
FMLOG
(
_T
(
"Failed to determine response data."
));
}
closesocket
(
io_data
->
socket
);
//! Free all buffer
HeapFree
(
GetProcessHeap
(),
0
,
io_data
);
}
}
else
{
FMLOG
(
_T
(
"Incompatible protocol."
));
}
HeapFree
(
GetProcessHeap
(),
0
,
io_data
);
}
VOID
FMSockServer
::
SetRelay
(
FMApiRelay
*
relay
)
...
...
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