2016-04-18 68 views
1

我試圖如何使用winsock API的recv函數從HTTP請求接收二進制數據。如何接收來自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緩衝每次它填補了達到其最大容量。像std::stringstd::vector這樣的STL容器可以爲你處理這個問題。當重新分配以更好地最大化內存性能和使用率時,有很多算法可用來計算有效的增長增量,以上只是一個簡單的示例來演示此想法。

+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)); 

當DO循環結束:bytesRead持有數的字節讀出和數據在recvBuffer。如果iRecv爲零,則連接通常關閉。如果iRecv小於零,則出現錯誤。如果iRecv大於零,緩衝區已滿。

+0

謝謝,但我沒有完全得到我的數據 我只收到MAX_BUFFER的值。 我想我必須複製recvBuffer的內容,同時也動態增加接收器的大小。 ? – Ett

+0

@Ett根據需要多次調用此代碼。或者使緩衝區更大。 –