ソケット通信でのPOSTについての質問

このQ&Aのポイント
  • ソケット通信を使用して相手サーバーにPOSTでデータを送信していますが、いつも送信できません。
  • ソケット通信は正常に動作し、レスポンスも返ってきますが、POSTができていないようです。
  • PHPの問題なのか、HTTPの仕様を理解していないだけなのかわからず、他のサーバーでも同様の状態です。どうすれば解決できるでしょうか?
回答を見る
  • ベストアンサー

ソケット通信でのPOST

現在トラックバック機能を作っております。 ソケット関数を利用して、相手サーバーにPOSTで内容を送信しているのですが、 いつもPOST値が送れません。 コードはマニュアルのもの http://manual.xwd.jp/ref.sockets.html をそのまま使って試しています。 また、トラックバックの仕様 http://lowlife.jp/yasusii/stories/8.html こちらも目を通し、下記のリクエストを送信しています。 POST http://www.example.com/example/11\r\n" Content-Type: application/x-www-form-urlencoded\r\n" title=Foo+Bar&url=AAAAAA&excerpt=My+Excerpt&blog_name=Foo\r\n\r\n" その結果、ソケット通信は正常に動き、 レスポンスも返ってくるのですが、POSTができていないようで、いつもエラーがもどってきます。 POSTの練習ということで、ターゲットは、POSTされてきたものを返すようにしていますが、いつもそれが空欄になってもどってくるのです。 PHPの問題なのか、HTTPの仕様を理解していないだけなのかもわからず、違うサーバーで試してみたりもしてみましたが、同様の状態で、行き詰ってしまいました。 どうかご教示いただけたらと思います。

  • SHlVA
  • お礼率92% (60/65)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

的外れな回答のような気がしなくもないが・・・・。送信データを POST http://www.example.com/example/11 HTTP/1.0\r\n" Content-Type: application/x-www-form-urlencoded\r\n" title=Foo+Bar&url=AAAAAA&excerpt=My+Excerpt&blog_name=Foo\r\n\r\n" という風に、メソッド、パスの後に「HTTP/1.0」をつけてみるとどうだろう・・・・。 つけないと、HTTP/0.9として認識されるような気がする。HTTP/0.9は、一組のCR/LFでリクエストの終了を意味するので、そこでリクエストが終わっているのではなかろうか。 まったく自信ないが・・・・とりあえず試してみてくらはい。

SHlVA
質問者

お礼

anmochi様 アドバイスありがとうございます。 教えていただいたように、HTTP/1.0 や HTTP/1.1 などをつけて試してみましたが、結果は変わりませんでした。 もう少し調べてみたいと思います。

関連するQ&A

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • PHPでトラックバック送信しようとしているのですが・・

    下のような関数を作ってトラックバックを送信する機能を実装しようとしていますが、全く上手くいきません・・。$targeturlなどの引数の値は別のPHPスクリプトから取得しています。 やっかいなのは、このプログラムを実行してもエラーが出ないことです。そのため、どこが問題なのか全く分かりません。最後の変数$resの中身も空っぽです。さっぱりわかりません・・。どうか助けてください・・。 function sendTBPing($targeturl, $topicid, $title, $excerpt){   $port = 80;   $query = "";   // POSTするデータの作成   $post = "title=".urlencode(mb_convert_encoding($title,   "UTF-8"));   $post = $post."&url=".urlencode("http://users.mswave.com/~tsugio/blog/archives.php?topicid=". $topicid);   $post = $post."&excerpt=".urlencode(mb_convert_encoding($excerpt, "UTF-8"));   $post = $post."&blog_name=".urlencode(mb_convert_encoding('sample', "UTF-8"));      // ping先URLからホスト名やパスを取り出す   $pingurl = parse_url($targeturl);   if(isset($pingurl['query'])){ $query = "?".$pingurl['query'];   }   if(isset($pingurl['port'])){ $port = $pingurl['port'];   }   // HTTPリクエストの作成   $req = "POST".$pingurl['path'].$query."HTTP/1.1\r\n";   $req = $req."Host: ".$pingurl['host']."\r\n";   $req = $req."User-Agent: PHP/".phpversion()."\r\n";   $req = $req."Content-type: application/x-www-form-urlencoded\r\n";   $req = $req."Content-Length: ".strlen($post)."\r\n\r\n";   $req = $req.$post."\r\n";   // ソケットを開く   $fn = fsockopen($pingurl['host'], $port);   if($fn === false){ throw new exception("トラックバックPINGに失敗しました");   }   // 送信   fputs($fn, $req);   // レスポンス受信   $res = "";   while(!feof($fn)){ $res = $res.fgets($fn);   }   fclose($fn);  // レスポンスのボディに<error>1</error>が含まれていればエラー   list($rhead, $rbody) = split("\r\n\r\n", $res, 2);   $rbody = urlencode($rbody);   if(strstr($rbody, "<error>1</error>") !== false){ throw new exception($rbody);   } }

    • ベストアンサー
    • PHP
  • fsockopenのソケットが全然分からないのです

    fsockopenのソケットについて教えてください ▽PHP: fsockopen - Manual   http://php.net/manual/ja/function.fsockopen.php >fsockopen("www.example.com", 80, $errno, $errstr, 30); ■質問 ・ソケットて何ですか? ・この1行にどういう意味があるのでしょうか? ・事前に通信エラーを確認? ・GETとかPOSTとかでエラー判定してはいけないのでしょうか? ・「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください ■質問背景 ・APIコード見てたら、この処理が書かれていたので、調べてみたけど意味が理解できず、質問しました

    • ベストアンサー
    • PHP
  • どうか、POSTでのファイル転送の仕方を教えてください。

    どうか、POSTでのファイル転送の仕方を教えてください。 borland C++でhttp通信プログラムを書いています。 POSTを使ってhttp通信でファイルをサーバーに転送したいのですが、良く分かりません。 取り合えず、現状としてはwinsockを利用してファイルを転送しようとしました。 (ソース) SOCKET s; [ソケット生成完了] sprintf(send_buf, "POST %s /HTTP1.0\r\n\rHost: %s:%d\r\n", path, host, port); send(s, send_buf, strlen(send_buf), 0); sprinf(send_buf, "\r\n"); send(s, send_buf, strlen(send_buf), 0); ここまでは来たのですが、ここからwhileのfgetsでファイルをバッファにいれてソケットで送信したら、ただのソケット通信になってしまのでここからが分かりません。 この方法であっているのかも、よく分かりません。 http通信でファイルを転送するには、どうすればよいのでしょうか? どなたか、お教え願えませんか?

  • PHPでトラックバック機能 HTTPリクエスト

    現在、PHPにてブログシステムを作成中です。 ブログの特徴であるトラックバック機能について いろいろと調べてみたのですが、あまり理解できませんでした。 http://lowlife.jp/yasusii/stories/8.html#description こちらなどで、しくみ自体はなんとなく理解できたのですが、実装の面で、実際にどういうコーディングをすればいいのかがわかりません。 HTTPリクエストでPOSTする、 らしいのですが、 上記サイトでいうと POST http://www.hoge.hoge/mt-tb.cgi/5 Content-Type: application/x-www-form-urlencoded title=Foo+Bar&url=http://www.tbtest.com/&excerpt=My+Excerpt&blog_name=Foo というものだと思うのですが、これをどこに挿入すればいいのかがわかりません。 header() にいれたり、一番最初に記述したり、 いろいろ試してみたのですが、なぜかPHPファイルをダウンロードしようとして失敗しました、というエラーがでたりします。 根本的に間違ってるのかもしれませんが、 どうかご教示いただけたらと思います。 開発環境: WIN XP PRO Apache 2.0.54 PHP 5.0.4

    • ベストアンサー
    • PHP
  • 特定の値をPOST送信で他のサーバーに渡したい

    あるPHPページを自動転送ページとし、転送先に特定の値をPOST送信したいと考えています。 同じような質問があり、fsockopenを使ってすると良いようなのですが、どうしても上手くいきません。 現状、POST送信は成功しているのですが、URLが自動転送ページのままで、転送先ページのテキストのみが表示されている状態です。 どうすれば転送先ページに完全に移ってしまえるでしょうか。 ご助力下さい。 <ソース> $url = "http://hoge.co.jp/test.php";  //転送先URL $method = "POST"; $headers = "POST http://hoge.co.jp/test.php HTTP/1.1\r\n";  //転送先URL $postdata = "parm=ok"; $URL = parse_url($url); if(!isset($URL['port'])){$URL['port'] = 80;} //リクエストヘッダ $request = $method." ".$URL['path']." HTTP/1.0\r\n"; $request .= $headers; $request .= "Host: ".$URL['host']."\r\n"; $request .= "User-Agent: PHP/".phpversion()."\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: ".strlen($postdata)."\r\n"; $request .= "\r\n"; $request .= $postdata; //相手サーバへ接続 @$fp = fsockopen($URL['host'], $URL['port']); // 接続失敗 if (!$fp) {die("ただいまメンテナンス中です。\n");} //POSTで送信 fputs($fp, $request); $response = ""; while (!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp); //ヘッダ部分とボディ部分を分離 $DATA = split("\r\n\r\n", $response, 2); //出力 echo "<!--\n".$request."\n-->\n"; echo "<!--\n".$DATA[0]."\n-->\n"; echo $DATA[1];

    • ベストアンサー
    • PHP
  • ネットワーク初心者です。

    ネットワーク初心者です。 borland C++でプログラム作成しているのですが、windowsクライアントからサーバーに対してソケットを生成して(c言語)、ファイルをhttp通信で送信したいんですが、うまくいきません。とりあえず、ソケット生成とサーバーcgiプログラムを呼び出すことは出来たんですが、それに対してhttpでファイルを送信するには、どうすればいいのでしょうか? 誰か、ご教授願えますか? ちなみに、サーバーcgi呼び出したのは、 sprintf(send_buf, "POST %s http/1.0\r\n\r", path); send(s, send_buf, strlen(send_buf),0); sprintf(send_buf, "Host: %s:%d\r\n", host, port); send(s, send_buf, strlen(send_buf), 0); sprintf(send_buf, "\r\n"); send(s, send_buf, strlen(send_buf), 0); です。

  • C# ソケット通信で相手に送信できるか事前にチェックする方法

    C# ソケット通信で相手に送信できるか事前にチェックする方法 いつもお世話になっております。 チャットのようなプログラムを作ろうと思い、ソケット通信のやり方を勉強しているのですが、どうしてもできないことがあります。 IPアドレスとポートを指定して、その相手先と通信できるかどうかをタイムアウト以外で知る方法です。 また、今回はサーバーを立てずに同じLAN内であればやり取りできるようにしたいと思っています。 できればLAN内の端末すべてに送信といったこともしたいのですが、TCPではできないのでしょうか。 分かる方がいましたらお願いします。

  • phpを実行するとファイルダウンロードになる

    教えてください 以下のプログラムを記述したphpを実行すると、ファイルダウンロードになってしまいます ※プログラムはあるサイトにPOST送信をするものです 解決方法を教えてください よろしくお願いします <?php //ホスト設定 $host = "aaa.bbb.jp"; //パス設定 $path = "/data.php"; //POSTデータ設定 $data = "AAA=111&BBB=222&CCC=333&DDD=444"; //URLエンコード $data = urlencode($data); //実行 header("POST " . $path . " HTTP/1.1\r\n"); header("Host: " . $host . "\r\n"); header("Content-type: application/x-www-form-urlencoded\r\n"); header("Content-length: " . strlen($data) . "\r\n\r\n"); header($data); exit(0); ?>

    • 締切済み
    • PHP
  • postしたコンテンツの取得

    いつもお世話になっております。 PHPでHTTPでPOSTされたコンテンツを受け取るサンプルとして以下のような スクリプトを作成しました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php var_dump(file_get_contents('php://input')); ?></p> </body> </html> そしてデータの送信側のPHPスクリプトとして以下のようなものを作成しました。 <?php function post_request($url, $data, $referer='') { // Convert the data array into URL Parameters like a=b&foo=bar etc. $data = http_build_query($data); // parse the given URL $url = parse_url($url); if ($url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } // extract host and path: $host = $url['host']; $path = $url['path']; $port = $url['port']; var_dump($url); $fp = fsockopen($host, $port, $errno, $errstr, 30); if ($fp){ // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); if ($referer != '') fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp, 128); } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // return as structured array: return array( 'status' => 'ok', 'header' => $header, 'content' => $content ); } $fileHandle = fopen("/home/a/text.txt", "rb"); $fileContents = stream_get_contents($fileHandle); fclose($fileHandle); var_dump(post_request('http://ipaddress/rawpost.php',$fileContents)); ?> 上記PHPスクリプトによってPOSTされた結果のHTMLの var_dump(file_get_contents('php://input')) の部分はstring(0)となりました。 HTTPのPOSTのコンテンツ部分を取得するには どのようなスクリプトを記載すればよいのでしょうか。 どなたかご教授よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう