如何从 recv winsock 函数接收二进制数据
how to receive binary data from recv winsock function
我寻求如何使用 winsock 的 recv 函数从 HTTP 请求接收二进制数据 API。
我对 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
缓冲区填满其最大容量时重新分配缓冲区。 std::string
和 std::vector
等 STL 容器会在内部为您处理此问题。有很多算法可用于计算重新分配时的有效增长增量,以更好地最大化内存性能和使用,以上只是一个简单的例子来演示这个想法。
我寻求如何使用 winsock 的 recv 函数从 HTTP 请求接收二进制数据 API。
我对 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
缓冲区填满其最大容量时重新分配缓冲区。 std::string
和 std::vector
等 STL 容器会在内部为您处理此问题。有很多算法可用于计算重新分配时的有效增长增量,以更好地最大化内存性能和使用,以上只是一个简单的例子来演示这个想法。