2016-04-18 3 views
1

Я ищу, как получить двоичные данные из HTTP-запроса с функцией recv winsock API.Как получить двоичные данные из функции recv winsock

У меня нет проблем с std :: string и string.append() , но моя программа не нуждается в зависимости.

Кто-нибудь знает, как получить тот же результат только с буферами char *?

do { 
     iRecv = recv(m_socket, recvBuffer, MAX_BUFFER, 0); 

     if (iRecv > 0) 
     { 

     //Need to override std::string with pure WINAPI 
     response.append(recvBuffer, iRecv); 

     iResponseLength += iRecv; 
     xZeroMemory(recvBuffer, MAX_BUFFER); 

     } 
    } while(iRecv > 0); 
+1

'std :: string' хорошо способен хранить двоичные данные, однако вы можете найти с помощью' std :: vector 'более удобно. –

ответ

0

Нет никакой веской причины НЕ использовать контейнеры STL, поскольку они являются ядром для C++, поэтому они будут доступны в каждом компиляторе на C++.

Но, чтобы ответить на ваш вопрос, если вы потребность, чтобы избежать их по какой-либо причине, вы можете сделать что-то вроде этого:

int iResponseCapacity = MAX_BUFFER*5; 
int iResponseLength = 0; 
char *response = new char[iResponseCapacity]; 

do 
{ 
     iRecv = recv(m_socket, recvBuffer, MAX_BUFFER, 0); 
     if (iRecv <= 0) break; 

     if ((iResponseLength + iRecv) > iResponseCapacity) 
     { 
      int iNewCapacity = iResponseCapacity + (MAX_BUFFER*5); 
      char *newResponse = new char[iNewCapacity]; 
      memcpy(newResponse, response, iResponseLength); 
      delete[] response; 
      response = newResponse; 
      iResponseCapacity = iNewCapacity; 
     } 

     memcpy(&response[iResponseLength], recvBuffer, iRecv); 
     iResponseLength += iRecv; 
} 
while (true); 

//... 

delete[] response; 

Ключ перераспределить response буфер каждый раз, когда он заполняет до его максимальной емкости. Контейнеры STL, такие как std::string и std::vector, обрабатывают это внутренне для вас. Существует множество алгоритмов, позволяющих рассчитывать эффективные приращения роста при перераспределении, чтобы лучше максимизировать производительность и использование памяти, выше всего лишь простой пример для демонстрации идеи.

+0

Спасибо, что это решение работает как я хочу – Ett

3
int bytesRead, iRecv; 
char recvBuffer[MAX_BUFFER]; 

bytesRead = 0; 
do { 
    iRecv = recv(m_socket, recvBuffer + bytesRead, MAX_BUFFER - bytesRead, 0); 
    if (iRecv > 0) 
    bytesRead += iRecv; 
} while ((iRecv > 0) && (bytesRead < MAX_BUFFER)); 

Когда делать цикл завершается: bytesRead содержит число прочитанных байтов, и данные в recvBuffer. Если iRecv равно нулю, соединение нормально закрывается. Если iRecv меньше нуля, произошла ошибка. Если iRecv больше нуля, буфер заполняется.

+0

Спасибо, но я не получаю свои данные полностью Получаю только значение MAX_BUFFER. Я думаю, что мне нужно скопировать содержимое recvBuffer, а также динамически увеличивать размер приемника. ? – Ett

+0

@Ett Просто позвоните этому коду столько раз, сколько вам нужно. Или сделайте буфер больше. –

Смежные вопросы