2016-04-18 71 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根据需要多次调用此代码。或者使缓冲区更大。 –