簡體   English   中英

如何從recv winsock函數接收二進制數據

[英]how to receive binary data from recv winsock function

我尋求如何使用winsock API的recv函數從HTTP請求接收二進制數據。

我對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 );
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));

do循環完成時: bytesRead保存讀取的字節數,數據位於recvBuffer 如果iRecv為零,則連接通常是關閉的。 如果iRecv小於零,則出現錯誤。 如果iRecv大於零,則緩沖區已滿。

沒有充分的理由不使用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緩沖區達到最大容量時重新分配response緩沖區。 STd容器如std::stringstd::vector在內部為您處理。 在重新分配以更好地最大化內存性能和使用時,有許多算法可用於計算有效增長增量,上面只是演示該想法的一個簡單示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM