发布请求中的二进制数据

时间:2012-04-15 06:07:08

标签: c++ memory http-post

我已经阅读了有关http请求的文档,并在最后写了这个标题:

int *binary = new int[bufferLength]; // And fill it

std::stringstream out;
out << "POST /push1_pub?id=game HTTP/1.1\r\n";
out << "User-Agent: Lotosoft soccer client\r\n";
out << "Host: localhost\r\n";
out << "Accept: */*\r\n";
out << "Content-Type: application/octet-stream\r\n";
out << "Content-Length: " << bufferLength << "\r\n\r\n";

// Take out string from stream
std::string headers = out.str();
// Length of new array of bytes (headers + binary data + \0)
const int rawLen = headers.size() + bufferLength*sizeof(int) + 1;

char *raw = new char[rawLen];
// Copy headers data into bytes array
strcpy(raw, headers.c_str());
// Apply offset to bytes array and fill another part with binary array of ints
memcpy(raw+headers.size(), binary, bufferLength*sizeof(int));

std::cout << raw << std::endl;

// Send it to socket
if (socket.send(raw, rawLen) == -1)
{
    std::cout << "Failed to send headers\n";
}

发布请求发送成功,但我不确定我的想法一切都很好,将所有内容填充到字节数组中。这是将二进制数据作为后请求体传递的正确方法吗?

1 个答案:

答案 0 :(得分:1)

问自己这个问题:“我发送到服务器的帖子数据的第一个字节是什么?”。你看到你不知道 - 这是你的平台碰巧存储为数组的第一个字节,这取决于你的特定CPU如何存储整数。

服务器不知道你的CPU如何存储整数,所以你发送它的信息是没有可能的。您必须向服务器发送一个查询,该查询包含服务器期望的任何格式的字节,而不是您的平台喜欢的任何服务器。

另外,您告诉服务器您要发送bufferLength个字节,然后发送它bufferLength*sizeof(int)个字节。你必须保持一致。 (据推测,您不在使用一个字节整数的平台上。)