Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2008, 20:38   #1
Ale4ko
 
Регистрация: 16.09.2007
Сообщений: 2
Плохо Проблема HTTP сервера c двумя клиентами

Я пишу реализацию HTTP сервера и клиента на C++.
Клиент последовательно посылает 100 запросов. Когда HTTP сервер разговаривает с одним клиентом, то он работает хорошо. Но (!!!), когда он разговаривает c двумя клиентами (запросы посылаются на разные порты), сервер получает все запросы (200 requests), но тело (body) некоторых из запросов пусто. Общение между двумя клиентами и сервером происходит на одном физическом компютере с Windows XP.
Кто-то знает, почему тело некоторых из запросов пусто?

Код клиента :
Код:
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;
};

Последний раз редактировалось rpy3uH; 11.04.2008 в 19:18.
Ale4ko вне форума Ответить с цитированием
Старый 10.04.2008, 20:57   #2
Ale4ko
 
Регистрация: 16.09.2007
Сообщений: 2
По умолчанию Проблема HTTP сервера c 2-я клиентами (Продолжение)

Часть кода сервера,взятый из msdn (http://msdn2.microsoft.com/en-us/lib...spx).использую следующую функцию ,как listner:

Код:
        result = HttpReceiveHttpRequest(
                    hReqQueue,                                
                    requestId,                                
                    HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,      
                    pRequest,                                 
                    RequestBufferLength,                      
                    &bytesRead,                               
                    NULL                                      
                    );
И каждый запрос делаeт
    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
        {
            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,          //  
                               NULL,                // pReserved2
                               0,                   // Reserved3
                               NULL,                // LPOVERLAPPED
                               NULL                 
                               );
                    .....
                    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
                                );
    ...
}

Последний раз редактировалось rpy3uH; 11.04.2008 в 19:17.
Ale4ko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнить условие с двумя ComboBox monushka Помощь студентам 2 30.04.2008 13:18
Уравнение с двумя неизвестными sds Помощь студентам 4 23.04.2008 23:13
Помогите с двумя задачками - ассемблер Hollander Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 05.05.2007 23:10
Соединение можеду двумя ПК Killer_djon Общие вопросы Delphi 3 02.05.2007 12:14
работа с двумя книгами Реланиум Microsoft Office Excel 2 23.11.2006 16:37