よくこちらにはお世話になっています。
現在C言語,winsockによるHTTP通信を使用し、WEBサーバーにデータを保存するプログラムを組んでいるのですが、
サーバー側PHPへのデータPOSTが上手くいきません。
char buf[32];
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "POST /action/msg.php HTTP/1.0\n\n");
send(mSock, buf, (int)strlen(buf), 0);
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "Content-Length: 9\n\n");
send(mSock, buf, (int)strlen(buf), 0);
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "read=test");
send(mSock, buf, (int)strlen(buf), 0);
上記をconnect後送信しています。
また以下のような方法でのGETは問題なくできます。
char buf[32];
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "GET /action/msg.php?read=test HTTP/1.0\n\n");
send(mSock, buf, (int)strlen(buf), 0);
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "\n\n");
send(mSock, buf, (int)strlen(buf), 0);
また、こういったHTTP通信の場合winsockよりもwininetを使用した方がいいのでしょうか。
wininetについてのわかりやすい解説サイトがみつからずあたふたしています・・・。
HTTP通信、POSTについて
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: HTTP通信、POSTについて
winintの方が簡単だと思いますが、POSTは未経験なのでパスさせてください。
あと、codeタグを使ってくださいね。
下記サイトとか参考になりませんか?
「WinSockを用いて2ちゃんねるに書き込みを行う」
http://katahiromz.web.fc2.com/win32/write2ch.html
あと、codeタグを使ってくださいね。
下記サイトとか参考になりませんか?
「WinSockを用いて2ちゃんねるに書き込みを行う」
http://katahiromz.web.fc2.com/win32/write2ch.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: HTTP通信、POSTについて
普通に送信するだけなのですが……。くろねこ さんが書きました:現在C言語,winsockによるHTTP通信を使用し、WEBサーバーにデータを保存するプログラムを組んでいるのですが、
サーバー側PHPへのデータPOSTが上手くいきません。
HTTP通信のヘッダの区切りは\r\nです。
RFC 1945 : Hypertext Transfer Protocol -- HTTP/1.0
の5.1に,
とありますので。Request-Line = Method SP Request-URI SP HTTP-Version CRLF
次に,\n\nとなっていますが,上記の通りRequest-Lineの末尾はあくまでCRLFのみです。
さらに,同4.0に
とあり,調べると各種-HeaderはCRLFで終端するため,CRLFが2度続いた場所がヘッダの終端になります。
# 言語は固定幅のためにcodeタグを追加したために書かれているだけですので気にしないでください。
sendは指定したサイズ全てを送信するわけではないので,送信したいサイズ全てが送信したことを確認する必要があります。
-
くろねこ
Re: HTTP通信、POSTについて
softya(ソフト屋)さん、YuOさん。ご返信ありがとうございます。
コードを以下の様に変更し、実行してみましたが、やはり上手く動作しませんでした。
sendについてですが独自関数にて最後まで送信するようにしてあります。
※上記の動作確認については以前開発していたゲームにて確認済みです。
char buf[32];
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "POST /action/msg.php HTTP/1.0\r\n");
mySend(mSock, buf, (int)strlen(buf), 0);
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "read=test\r\n");
mySend(mSock, buf, (int)strlen(buf), 0);
こういうことで有っているでしょうか・・・。
コードを以下の様に変更し、実行してみましたが、やはり上手く動作しませんでした。
sendについてですが独自関数にて最後まで送信するようにしてあります。
※上記の動作確認については以前開発していたゲームにて確認済みです。
char buf[32];
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "POST /action/msg.php HTTP/1.0\r\n");
mySend(mSock, buf, (int)strlen(buf), 0);
memset(buf, 0, sizeof(buf));
_snprintf(buf, sizeof(buf), "read=test\r\n");
mySend(mSock, buf, (int)strlen(buf), 0);
こういうことで有っているでしょうか・・・。
Re: HTTP通信、POSTについて
ブラウザでアクセスした場合と通信内容が異なったりしませんか。くろねこ さんが書きました:コードを以下の様に変更し、実行してみましたが、やはり上手く動作しませんでした。
sendについてですが独自関数にて最後まで送信するようにしてあります。
私はHTTP通信の確認にFiddlerを使っていますが,
Fiddlerその他を使ってブラウザでの通信の内容をキャプチャして,その出力と自分が出力している内容を比較してみてはどうでしょう。
# Content-Typeの未指定が気になるところではあります。
あと,PHP側でログを出力してみるのも手だと思います。
-
たろ
Re: HTTP通信、POSTについて
興味があったので CentOS 5.5 の Apache+PHP で試してみたところ、
YuOさんのコメントにあるように、Content-Type ヘッダを指定しないと
phpでPOSTデータが取得できませんでした。理由はよくわかりません・・。
くろねこさんの環境だと以下のデータ送信で動かないでしょうか。
POST /action/msg.php HTTP/1.0\r\n
Content-Length: 9\r\n
Content-Type: application/x-www-form-urlencoded\r\n
\r\n
read=test
YuOさんのコメントにあるように、Content-Type ヘッダを指定しないと
phpでPOSTデータが取得できませんでした。理由はよくわかりません・・。
くろねこさんの環境だと以下のデータ送信で動かないでしょうか。
POST /action/msg.php HTTP/1.0\r\n
Content-Length: 9\r\n
Content-Type: application/x-www-form-urlencoded\r\n
\r\n
read=test
-
くろねこ
Re: HTTP通信、POSTについて
YuOさん、たろさん、ありがとうございます。
おかげさまで無事に動作させることが出来ました!
今後もがんばって脱初心者したいとおもいます!
おかげさまで無事に動作させることが出来ました!
今後もがんばって脱初心者したいとおもいます!