如何从recv winsock函数接收二进制数据

时间:2016-04-18 13:42:26

标签: c++ winapi winsock

我寻求如何使用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 );

2 个答案:

答案 0 :(得分: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大于零,则缓冲区已满。

答案 1 :(得分: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::string缓冲区。像std::vectorcomposeWith这样的STL容器会在内部为您处理。在重新分配以更好地最大化内存性能和使用时,有许多算法可用于计算有效增长增量,上面只是演示该想法的一个简单示例。