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;
}

Last edited by shabbir; 11Apr2008 at 10:47.. Reason: Code block