Commit 68a7e05d by Carwyn

Fixes: 1. 大数据包接收失败问题

parent 11222179
......@@ -111,12 +111,13 @@ BOOL FMSockServer::_Listen()
io_data->buffer.buf = (char*)&io_data->header;
io_data->relay = _relay;
io_data->socket = sclient;
io_data->offset = 0;
WSARecv(sclient, &io_data->buffer, 1, NULL, &io_data->flags, &io_data->overlap, FMSockServer::RecvRoutine);
DWORD res = SleepEx(1000, TRUE);
while (res != WAIT_IO_COMPLETION) {
FMLOG(_T("_Listen Rewaiting for I/O completion..."));
FMLOG(_T("Rewaiting for msg header I/O completion..."));
res = SleepEx(1000, TRUE);
}
}
......@@ -149,23 +150,25 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
HeapFree(GetProcessHeap(), 0, io_data);
return;
}
FMLOG(_T("Received bytes: %ld."), bytes);
FMLOG(_T("Received bytes: %ld."), io_data->offset + bytes);
UINT data_len = strlen(io_data->msg);
if (io_data->header.flag == FMSOCKFLAG) {
if (err != 0 || bytes == 0) {
//! Connection was closed by client
closesocket(io_data->socket);
FMLOG(_T("Error receiving data."));
}
else if (strlen(io_data->msg) < io_data->header.len) {
else if (data_len < io_data->header.len) {
//! Receive data
if (data_len == 0) {
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->buffer.buf = io_new_data->msg + io_new_data->offset;
io_new_data->socket = io_data->socket;
io_new_data->relay = io_data->relay;
......@@ -174,16 +177,27 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
io_new_data->header = io_data->header;
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("RecvRoutine 1 Rewaiting for I/O completion..."));
FMLOG(_T("Rewaiting for new data(offset: %ld)I/O completion..."), io_new_data->offset);
res = SleepEx(1000, TRUE);
}
}
else {
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) {
FMLOG(_T("Rewaiting for old data(offset: %ld)I/O completion..."), io_data->offset);
res = SleepEx(1000, TRUE);
}
}
}
else {
//! Legal freemud api data
FMLOG("All data received: %s", io_data->msg);
io_data->msg[bytes] = '\0';
char *response = NULL; UINT len = 0;
......@@ -203,7 +217,7 @@ void FMSockServer::RecvRoutine(DWORD err, DWORD bytes, LPWSAOVERLAPPED overlappe
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("RecvRoutine Rewaiting for I/O completion..."));
FMLOG(_T("Rewaiting send for I/O completion..."));
res = SleepEx(1000, TRUE);
}
}
......
......@@ -35,6 +35,7 @@ typedef struct
DWORD flags;
SOCKET socket;
FMApiRelay *relay;
UINT offset;
FMSOCKHEADER header;
char msg[1];
......
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