0

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";
}

Postリクエストはsuccessfulを送信しますが、すべてをバイト配列に入力するという私の考えですべてがうまくいくかどうかはわかりません。これは、リクエスト後の本文としてバイナリデータを渡す正しい方法ですか?

4

1 に答える 1

1

「サーバーに送信する投稿データの最初のバイトは何ですか?」という質問を自問してください。わからないことがわかりますか?それは、プラットフォームがたまたま配列の最初のバイトとして格納するものであり、特定の CPU が整数を格納する方法によって異なります。

サーバーは、CPU が整数を格納する方法を認識していないため、意味をなさない方法で情報を送信しています。プラットフォームが好むサーバーではなく、サーバーが期待する形式のバイトで構成されるクエリをサーバーに送信する必要があります。

また、サーバーにbufferLengthバイトを送信することを伝えますが、その後、バイトを送信しbufferLength*sizeof(int)ます。一貫性を保つ必要があります。(おそらく、1 バイト整数を使用するプラットフォームを使用していません。)

于 2012-04-15T06:30:38.193 に答える