- ベストアンサー
Winsockで「GET / HTTP/1.1」リクエストを送信するプログラムの受信できない問題について
- Winsockを使用して、「GET / HTTP/1.1」というリクエストを自分自身に送信し、受信できない問題が発生しています。
- プログラムを作成したが、APACHE2のドキュメントルートにある「index.html」を見ることができません。
- 接続やデータの送信にエラーがないことを確認したが、受信ができない原因を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
serverOption.sin_port=htonl(80); ↓ serverOption.sin_port=htons(80); ポート番号(sin_port)は16ビットなので、質問文のプログラムでは80はhtonlで一度32ビット(00 00 00 80)に変換されてから、16ビット(00 00, 後ろ16ビットは切り捨て)に変換されてしまいます。 結果として0番ポートに接続しています。 htonsを使うようにしてください。 func_Error=send(hsock,"GET / HTTP/1.1",strlen("GET / HTTP/1.1"),0); ↓ func_Error=send(hsock,"GET / HTTP/1.1\n\n",strlen("GET / HTTP/1.1\n\n"),0); HTTPでは空の行(改行のみ)が送られてくるまでは、リクエストが終了したとみなされないため、サーバーは何も送信してきません。 あとserverOptionは値を入れる前にmemsetなどで0で埋めておいたほうがいいです。
その他の回答 (2)
- egeg007
- ベストアンサー率33% (3/9)
RFC2068を見ると、以下のようになっています。 5.1 Request-Line The Request-Line begins with a method token, followed by the Request-URI and the protocol version, and ending with CRLF. たぶん、送信コマンド末尾にCRLF がないからではないでしょうか? "GET/HTTP/1.1" --> "GET/HTTP/1.1\r\n" に置き換えてみてください。
お礼
質問に答えてくださりありがとう御座いました。 「GET/HTTP/1.1」の部分を直してみたいと思います。
- valvelde
- ベストアンサー率35% (46/129)
送信したあとすぐに受信しているためサーバーからデータを受信する前にrecvをコールしてエラーになっているんじゃないでしょうか。
お礼
質問に答えてくださり有難う御座いました。 どうやらそれもあったようで、send関数を使った後に、printfを入れることで解決できました。
お礼
質問に答えてくださり有難うございました。 おかげで、問題は解決できました。