Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   HTTP server problem when running two clients (http://www.go4expert.com/forums/http-server-running-clients-t9920/)

ale4ko 10Apr2008 23:49

HTTP server problem when running two clients
 
I wrote an HTTP server and a client.A client sends 100 requests in a sequentially order.
When I run the HTTP server with one client it works ok.
But, when I run the HTTP server with two clients (each sends requests to a different port) the server get all the requests (200 requests) but the body of some of the requests is empty.
I run the 3 processes on the same computer with Windows XP.
Does anyone know why the body is empty?
Code:

Client code is the following:
int main (int argc, char *argv[])
{
  BOOL  bResults = FALSE;
  HINTERNET hSession = NULL;
  HINTERNET hConnect = NULL;
  HINTERNET hRequest = NULL;
  DWORD dwSize = 0;
  DWORD dwDownloaded = 0;
  LPSTR pszOutBuffer;

  for (int i = 1; i<=100; i++)
  {
    hSession = NULL;
    hConnect = NULL;
    hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(  L"A WinHTTP Example Program/1.0",
                          WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                          WINHTTP_NO_PROXY_NAME,
                          WINHTTP_NO_PROXY_BYPASS, 0);

    // Specify an HTTP server.
    if (hSession)
      hConnect = WinHttpConnect( hSession, L"localhost",
                              80, 0);

    // Create an HTTP Request handle.
    if (hConnect)
      hRequest = WinHttpOpenRequest( hConnect, L"POST", L"/index.html",
                                    NULL, WINHTTP_NO_REFERER,
                                    WINHTTP_DEFAULT_ACCEPT_TYPES, 0);

    // Send a Request.
    if (hRequest)
      bResults = WinHttpSendRequest( hRequest,
                                    WINHTTP_NO_ADDITIONAL_HEADERS, 0,
                                    "ABC", 4, 4, 0);

    // Place additional code here.


    // Report errors.
    if (!bResults)
      printf("Error %d has occurred.\n",GetLastError());

    // End the request.
    if (bResults)
      bResults = WinHttpReceiveResponse( hRequest, NULL);

    // Keep checking for data until there is nothing left.
    if (bResults)
      do
      {

        // Check for available data.
        dwSize = 0;
        if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
          printf("Error %u in WinHttpQueryDataAvailable.\n",GetLastError());

        // Allocate space for the buffer.
        pszOutBuffer = new char[dwSize+1];
        if (!pszOutBuffer)
        {
          printf("Out of memory\n");
          dwSize=0;
        }
        else
        {
          // Read the Data.
          ZeroMemory(pszOutBuffer, dwSize+1);

          if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
            dwSize, &dwDownloaded))
            printf("Error %u in WinHttpReadData.\n", GetLastError());
          else
            printf("%s",pszOutBuffer);

          // Free the memory allocated to the buffer.
          delete [] pszOutBuffer;
        }

      } while (dwSize>0);

    // Close open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);
  }

  return 0;
};


Part of the server code (taken from msdn):
I use the following function as a listner:
Code:

        result = HttpReceiveHttpRequest(
                    hReqQueue,                               
                    requestId,                               
                    HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,     
                    pRequest,                               
                    RequestBufferLength,                     
                    &bytesRead,                             
                    NULL                                     
                    );

And for each request do
Code:

    if(pRequest->Flags & HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS)
    {

        if(GetTempFileName(L".\",L"New",0, szTempName) == 0)
        {
            result = GetLastError();
            wprintf(L"GetTempFileName failed with %lu \n", result);
            goto Done;
        }

hTempFile = CreateFile(szTempName, GENERIC_READ | ENERIC_WRITE, 0, NULL,            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

        if(hTempFile == INVALID_HANDLE_VALUE)
        {
            result = GetLastError();
            wprintf(L"Could not create temporary file. Error %lu \n", result);
            goto Done;
        }

        do
        {
            //
            // Read the entity chunk from the request.
            //
            BytesRead = 0;
            result = HttpReceiveRequestEntityBody(
                        hReqQueue,
                        pRequest->RequestId,
                        0,
                        pEntityBuffer,
                        EntityBufferLength,
                        &BytesRead,
                        NULL
                        );

            switch(result)
            {
                case NO_ERROR:

                    if(BytesRead != 0)
                    {
                        TotalBytesRead += BytesRead;
                        WriteFile(
                                hTempFile,
                                pEntityBuffer,
                                BytesRead,
                                &TempFileBytesWritten,
                                NULL
                                );

                    }
                    break;

                case ERROR_HANDLE_EOF:


                    if(BytesRead != 0)
                    {
                        TotalBytesRead += BytesRead;
                        WriteFile(
                                hTempFile,
                                pEntityBuffer,
                                BytesRead,
                                &TempFileBytesWritten,
                                NULL
                                );
                    }



                    StringCchPrintfA(
                            szContentLength,
                            sizeof(szContentLength),
                            "%lu",
                            TotalBytesRead
                            );

                    ADD_KNOWN_HEADER(
                            response,
                            HttpHeaderContentLength,
                            szContentLength
                            );

                    result =
                        HttpSendHttpResponse(
                              hReqQueue,          // ReqQueueHandle
                              pRequest->RequestId, // Request ID
                              HTTP_SEND_RESPONSE_FLAG_MORE_DATA,
                              &response,          // HTTP response
                              NULL,                // pReserved1
                              &bytesSent,          // bytes sent (optional)
                              NULL,                // pReserved2
                              0,                  // Reserved3
                              NULL,                // LPOVERLAPPED
                              NULL                // pReserved4
                              );

                    if(result != NO_ERROR)
                    {
                        wprintf(L"HttpSendHttpResponse failed with %lu \n",
                                result);
                        goto Done;
                    }

                    //
                    // Send entity body from a file handle.
                    //
                    dataChunk.DataChunkType =
                        HttpDataChunkFromFileHandle;

                    dataChunk.FromFileHandle.
                        ByteRange.StartingOffset.QuadPart = 0;

                    dataChunk.FromFileHandle.
                        ByteRange.Length.QuadPart = HTTP_BYTE_RANGE_TO_EOF;

                    dataChunk.FromFileHandle.FileHandle = hTempFile;

                    result = HttpSendResponseEntityBody(
                                hReqQueue,
                                pRequest->RequestId,
                                0,                    // This is the last send.
                                1,                    // Entity Chunk Count.
                                &dataChunk,
                                NULL,
                                NULL,
                                0,
                                NULL,
                                NULL
                                );

                    if(result != NO_ERROR)
                    {
                        wprintf(
                          L"HttpSendResponseEntityBody failed with %lu \n",
                          result
                          );
                    }

                    goto Done;

                    break;


                default:
                    wprintf(L"HttpReceiveRequestEntityBody failed with %lu \n",
                            result);
                    goto Done;
            }

        } while(TRUE);
    }
    else
    {
        // This request does not have any entity body.
        //

        result = HttpSendHttpResponse(
                  hReqQueue,          // ReqQueueHandle
                  pRequest->RequestId, // Request ID
                  0,
                  &response,          // HTTP response
                  NULL,                // pReserved1
                  &bytesSent,          // bytes sent (optional)
                  NULL,                // pReserved2
                  0,                  // Reserved3
                  NULL,                // LPOVERLAPPED
                  NULL                // pReserved4
                  );
        if(result != NO_ERROR)
        {
            wprintf(L"HttpSendHttpResponse failed with %lu \n", result);
        }
    }

Done:

    if(pEntityBuffer)
    {
        FREE_MEM(pEntityBuffer);
    }

    if(INVALID_HANDLE_VALUE != hTempFile)
    {
        CloseHandle(hTempFile);
        //DeleteFile(szTempName);
    }

    return result;
}



All times are GMT +5.5. The time now is 11:41.