HTTP通信、POSTについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
くろねこ

HTTP通信、POSTについて

#1

投稿記事 by くろねこ » 13年前

よくこちらにはお世話になっています。

現在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についてのわかりやすい解説サイトがみつからずあたふたしています・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: HTTP通信、POSTについて

#2

投稿記事 by softya(ソフト屋) » 13年前

winintの方が簡単だと思いますが、POSTは未経験なのでパスさせてください。
あと、codeタグを使ってくださいね。

下記サイトとか参考になりませんか?
「WinSockを用いて2ちゃんねるに書き込みを行う」
http://katahiromz.web.fc2.com/win32/write2ch.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: HTTP通信、POSTについて

#3

投稿記事 by YuO » 13年前

くろねこ さんが書きました:現在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");
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に

コード:

       Full-Request   = Request-Line             ; Section 5.1
                        *( General-Header        ; Section 4.3
                         | Request-Header        ; Section 5.2
                         | Entity-Header )       ; Section 7.1
                        CRLF
                        [ Entity-Body ]          ; Section 7.2
とあり,調べると各種-HeaderはCRLFで終端するため,CRLFが2度続いた場所がヘッダの終端になります。
# 言語は固定幅のためにcodeタグを追加したために書かれているだけですので気にしないでください。
くろねこ さんが書きました:

コード:

send(mSock, buf, (int)strlen(buf), 0);
sendは指定したサイズ全てを送信するわけではないので,送信したいサイズ全てが送信したことを確認する必要があります。

くろねこ

Re: HTTP通信、POSTについて

#4

投稿記事 by くろねこ » 13年前

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);

こういうことで有っているでしょうか・・・。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: HTTP通信、POSTについて

#5

投稿記事 by YuO » 13年前

くろねこ さんが書きました:コードを以下の様に変更し、実行してみましたが、やはり上手く動作しませんでした。
sendについてですが独自関数にて最後まで送信するようにしてあります。
ブラウザでアクセスした場合と通信内容が異なったりしませんか。
私はHTTP通信の確認にFiddlerを使っていますが,
Fiddlerその他を使ってブラウザでの通信の内容をキャプチャして,その出力と自分が出力している内容を比較してみてはどうでしょう。
# Content-Typeの未指定が気になるところではあります。

あと,PHP側でログを出力してみるのも手だと思います。

たろ

Re: HTTP通信、POSTについて

#6

投稿記事 by たろ » 13年前

興味があったので 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

くろねこ

Re: HTTP通信、POSTについて

#7

投稿記事 by くろねこ » 13年前

YuOさん、たろさん、ありがとうございます。
おかげさまで無事に動作させることが出来ました!

今後もがんばって脱初心者したいとおもいます!

閉鎖

“C言語何でも質問掲示板” へ戻る