Commit daf2cd68 by Carwyn

Fixes: 1.接收完成判断不正确导致的 socket 阻塞问题

parent 68a7e05d
......@@ -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;
}
......
......@@ -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)
......
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