void CAdminSocket::OnReceive(int nErrorCode) { if (nErrorCode) { Close(); m_pAdminInterface->Remove(this); return; } int numread = Receive(m_pRecvBuffer + m_nRecvBufferPos, m_nRecvBufferLen - m_nRecvBufferPos); if (numread > 0) { SYSTEMTIME sTime; GetSystemTime(&sTime); VERIFY(SystemTimeToFileTime(&sTime, &m_LastRecvTime)); m_nRecvBufferPos += numread; if (m_nRecvBufferLen-m_nRecvBufferPos < (BUFSIZE/4)) { unsigned char *tmp=m_pRecvBuffer; m_nRecvBufferLen *= 2; m_pRecvBuffer = new unsigned char[m_nRecvBufferLen]; memcpy(m_pRecvBuffer, tmp, m_nRecvBufferPos); delete [] tmp; } int parseResult; while ((parseResult = ParseRecvBuffer()) > 0); if (parseResult == -1) return; } if (numread == 0) { if (ParseRecvBuffer() == -1) return; Close(); m_pAdminInterface->Remove(this); return; } else if (numread == SOCKET_ERROR) { if (WSAGetLastError() != WSAEWOULDBLOCK) { if (ParseRecvBuffer() == -1) return; Close(); m_pAdminInterface->Remove(this); return; } } while (ParseRecvBuffer() > 0); }
int post_api_comm_communcation(SOCKET ClientSocket, const char *IpAddress, u_short Port, char *SendBuffer){ //char *SendBuffer, *RecvBuffer; char RecvBuffer[SOCKET_MAX_BUF]; int SendRes = 0, RecvRes = 0; int SendLen = 0, RecvLen = 0; int RecvBufferIsEmpty = 0; int ParseRes = 0; SendRes = send(ClientSocket, SendBuffer, SendLen, 0); if(SendRes == SOCKET_ERROR){ return -1; } while(1){ RecvRes = recv(ClientSocket, RecvBuffer, SOCKET_MAX_BUF, 0); if(RecvRes == 0 || RecvRes == SOCKET_ERROR){ break; } if((int)strlen(RecvBuffer) != 0){ RecvBufferIsEmpty = 0; } if(RecvBufferIsEmpty == 0){ ParseRes = ParseRecvBuffer(RecvBuffer, RecvRes, POST_API_ACTION_COMM); if(ParseRes != -1){ // undo } } } //undo return 1; }