2012-04-15 15 views
0

純粋なソケットを使用してpost-requestをC++で送信する必要があります。ここで間違っている可能性が何ソケットによるPOST要求

<html> 
<head><title>400 Bad Request</title></head> 
<body bgcolor="white"> 
<center><h1>400 Bad Request</h1></center> 
<hr><center>nginx</center> 
</body> 
</html> 

:私が持っている身体を送った後

int *binary = new int[bufferLength]; 
... 

std::stringstream out(data); 
out << "POST /push1_pub?id=game HTTP/1.1\n"; 
out << "Host: http://0.0.0.0:80\n"; 
out << "Content-Length: "; 
out << bufferLength*sizeof(int); 
out << "\r\n\r\n"; 
out << binary; 

if (socket.send(data.c_str(), data.size()) == -1) 
{ 
    std::cout << "Failed to send headers\n"; 
} 
else 
{ 
    // Send request body 
    socket.send(reinterpret_cast<char*>(binary), bufferLength*sizeof(int)); 
    // Get the answer of server 
    char buf[1024]; 
    std::cout << socket.recv(buf, 1024) << std::endl; 
    std::cout << buf << std::endl; 
} 

しかしbuf中:私はどこリクエストのボディを送信するために理解できないのですか?


UPD:私が原因あなたのコメントに書かれている

新しいヘッダ:

std::string data; 
std::stringstream out(data); 
out << "POST /push1_pub?id=game\r\n"; 
out << "Host: http://localhost\r\n"; 
out << "Content-Length: "; 
out << bufferLength << "\r\n"; 
out << "\r\n\r\n"; 
out << binary; 

はまだ同じ問題を抱えています。


このコマンドで

UPD2

curl -s -v -X POST 'http://0.0.0.0/push1_pub?id=game' -d 'Test'すべてが正常に動作し、POSTリクエストが生成され、右送信されます。

+0

あなたはフィドラーで何を見ますか? – SLaks

+0

@SLaks私はLinuxで動かすことができませんか? – Ockonal

+0

実際の問題ではありませんが、CRだけでなく、[CRLF](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.1)で各ヘッダーを終了する必要があります。また、[チャンクエンコーディング](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1)をサポートしない限り、 'HTTP/1.1'を指定しないでください。 (そのセクションの最後に* MUST *の行があることに注意してください) –

答えて

2

ホストラインが間違っています。これは単純なホスト名でなければなりません。 "localhost"または "example.com"ではなく、現在入手しているhttp://0.0.0.0:80のURLではありません。

ホストラインは、ウェブサーバによって、単一のIP上でホストされている数多くのサイトが要求されている可能性のあるものを特定するために使用されます。 HTTPヘッダーを送信する頃には、TCP接続が既に確立されているため、ポート番号も無用です。すでにHTTPリクエストを行っているので、使用中のプロトコルを重複して指定する必要はありません。

+0

よろしくお願いいたします。しかし、正確に 'バイナリ'配列を送るのはどこですか?私はそれをヘッダーに追加し、ヘッダーを送信した後に送信しようとしています。 p.s.まだ400のエラーがあります。 – Ockonal

+0

コードにはいくつかの問題がありますが、いくつかの問題があります。独自のHTTPクライアントの実装を主張する場合は、まず[HTTP仕様](http://www.w3.org/Protocols/rfc2616/rfc2616.html)を調べることから始めてください。しかし、すでに行われているものを使用する方がはるかに合理的です。 HTTPは実際には単純なプロトコルではありません –

関連する問題