• 締切済み

fsockopenでsocket_bindって出来ますか?

fsockopenでsocket_bindって出来ますか? http://questionbox.jp.msn.com/qa4280167.html で以前あがっていた内容を見て、fsockopenでsocket_bindをしたいと思うのですが うまくいきません。 ソケット関数(socket_connect)を使おうかと思ったのですが、それだとセッション中のタイムアウトは設定できても 接続のタイムアウトが設定出来ないため実用的でないと考えました。 やろうと思っている事は上記のURLの方と同様に複数IPアドレス環境下でのHTTPクライアントの 作成です。 fsockopenでのIPアドレスのバインド、もしくはsocket_createでの接続タイムアウトの方法を ご存知の方いらっしゃいましたらアドバイスをよろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数8

みんなの回答

回答No.1

検索してみましたが、どうもタイムアウトは設定出来ないようですね。 socket_createしたあとに、 socket_nonblockingで非ブロックモードにして、プログラムが停止しないようにする、 というやり方は、公式マニュアルの下部にあるコメントでも書いてありましたが、 そもそもレスポンスが遅いサーバに接続しに行ったときに、接続できずに終わりそうな気がします(実際はわかりませんが。)

1000ccc
質問者

お礼

ありがとうございます。 非ブロックモードでは実現出来ないと前にどこかで見たので選択肢から 外していましたが、 一応検証してみようと思います。 結果はまたご報告します。

関連するQ&A

  • Socketの接続のタイムアウトを設定するには

    JavaでSocket通信をしようとおもっています。 Socketはnewするときにconnectもしてしまいまうらしいので 妙なIPアドレスを指定したりして、応答がもどってこないと すべてそこで止まってしまうとおもうのですが、 Timeoutをかける方法はないのでしょうか。 setSoTimeoutというメソッドはreadのときとかStreamに関してしか かけられないということが分かりました。 Socketのコンストラクタの引数にSocketImplを指定して、 Socket.setSoTimeoutしてから SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、 setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。 どこかに情報がないかと検索エンジンでも探してみたのですが、 見つかりません。もしかしてタイムアウトを設定するのは 一般的な方法ではないのかとも思えてきました。 ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。 どのような設計(というか使うクラス?)をするべきなのか、 思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。 よろしくお願い致します(__)

  • JAVAでソケット通信(クライアント)の際のbind方法

    JAVA初心者です。 アクセス元のIPアドレスで認証をしているサイトがあり、 httpアクセスでそこから定期的に情報を取ってくるようなものを JAVAで作っています。 対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。 ~~前略~~ Socket socket = new Socket(Host, 80); bind(socket,"IPアドレス"); ~~後略~~ もしくは ~~前略~~ Socket socket = new Socket(); bind(socket,"IPアドレス"); ~~後略~~ など、いずれもうまくいきません。なお、クライアントマシンには使用するIPアドレスは全て定義済みです。 また、アクセス元(JAVAが動くPC)のIPアドレスを指定せず デフォルトのままでアクセスする事自体は ~~前略~~ // Hostの内容はyahoo.co.jp等特にアクセスの制限の無いサイトのもの Socket socket = new Socket(Host, 80); ~~後略~~ とすることで接続出来ました。 皆さんの知恵を貸していただければと思います。 アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Android Socket.connectエラー

    Androidでソケット通信するプログラムを作っています。 PC側がソケットサーバーをたてて(accept)、 Android側でクライアントとして接続(connect)するようにしています。 connectを実行している部分のソースは以下のようにしています。 ----------------- String ip = "192.168.XX.XX"; <-PCのIPアドレス int port = 9999; socket = new Socket(); InetSocketAddress addr = new InetSocketAddress(ip, port); try{ socket.connect(addr); return true; }catch(IOException e){ e.printStackTrace(); return false; } ------------------ 上記やり方でまずはエミュレータで試したところうまく行きました、その後 実機に入れて同じように実行したところconnectのところで例外が飛んできます。 メッセージは"no route to host"でした。 実は全く同じソースで以前は実機でもできていたはずなんですが、 最近試したところできなくなっているようでした。 Android端末はXperia Arcですが、OSを2.3.4にバージョンアップしたことくらいで 以前と特に変わったところはないと思うのですが 原因として何が考えられるでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • SOCKETで入手したデータを抜き出したい

    他サーバのHTMLから部分的に抜き出したいと思っています。 他サーバのHTMLを表示する所までは出来たのですが、抜き出す所が出来ずに困っています。 私が抜き出そうと、表示のwhile文内を下記に変えた所、何も表示されなくなりました。  if( $_ =~ m/抜き出したい頭のキーワード/ ){ $flag = 1;}  if( $_ =~ m/表示したい尾のキーワード/ ){ $flag = 0;}  if( $flag eq 1){ print $_;} このwhile文内には変数に代入するとどうもNGのようです。 教えてGooの過去ログにも同様の質問があったのですが、 解決に至っていませんでした。ご教示願います。 ↓現在のソースコード ---------------------------- #!/usr/local/bin/perl -w use strict; use Socket; # Socket モジュールを使う # 接続先ホスト名 my $host = 'www.xxxx.co.jp'; # HTTP プロトコルを使う my $port = getservbyname('http', 'tcp'); # ホスト名を、IP アドレスの構造体に変換 my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 my $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$host のポート $portに接続できません。\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWW サーバに HTTP リクエストを送る print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; # ヘッダ部分を受け取る while (<SOCKET>){ # 改行のみの行ならループを抜ける m/^\r\n$/ and last; } # ボディ部分を受け取り、表示 while (<SOCKET>){ print $_; }

    • ベストアンサー
    • Perl
  • bind と mkstemp

    ソケットプログラミングの練習をしています。 OSはlinux(fedora core)です。 サーバーとクライアントの2つのプログラムを作成しました(とはいっても授業でやったものをうつしただけですが)。同一計算機内で、クライアントがおくったメッセージをサーバープログラム側で表示し、クライアント側にも返えすという単純なプログラムです。 そこでbind()にて不思議な問題が生じ困っています。 クライアントプログラムの一部分ですが、 struct sockaddr_un client_name; sock = socket(AF_UNIX, SOCK_DGRAM, 0); client_name.sun_family = AF_UNIX; strcpy(client_name.sun_path, "clinent_XXXXXX"); mkstemp(client_name.sun_path); printf("socket addr:<%s>\n",client_name.sun_path); len = sizeof(struct sockaddr); // =16 if(bind(sock, (struct sockaddr *)&client_name, len) < 0){ perror("bind failed"); exit(1); } 略 としています。なにが問題かというと、ユニークなアドレスを付けるために、mkstempをつかっているのですが、 bind failed:Address already in use とでてしまいます。ソケットファイルがあらたに生成されているか確認すると、ちゃんとユニークなファイルができています(ですがこれはアイコン表示からするとソケットファイルではないみたいです) ところが、mkstempをコメントアウトするとしてプログラムから除外すると、client_XXXXXX というソケットファイルがしっかりと生成され、エラーもおこりません。こちらのファイルアイコンはちゃんとソケットファイルのアイコンになっています。 なにがいけないのでしょうか。

  • PerlでSocketを閉じずに再利用する方法

    インターネット上の情報を参考に作成したCGIでPerlのソケットを用いて通信を行っておりますが、CGIが呼び出されるたびに以下のような動作を行っております。 ソケット生成 -> ソケット接続 -> HTTP通信 -> ソケット切断 このうち、ソケットの接続におおよそ200ミリ秒ほどかかり、このレイテンシを減らすため、ソケットはCGIが呼び出されるたびに生成、接続するのではなく、最初からセッションを張った状態で、CGIが呼び出されるとHTTP通信部分のみを行うようにすることはできますでしょうか。 現在試したこととして、1回目の呼び出しでソケットをクローズせずに処理を終了し、2回目でソケットの生成、接続をせずに直接HTTP通信をしようとしてもうまくいきませんでした。 Perl、ネットワークプログラミング初心者なもので恐縮ですが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • BINDの設定について

    ここのサイトを観てやってます・・・ http://centossrv.com/bind.shtml 一通り設定してエラーが出て、 エラーの内容は ここの (2) BINDの設定 で、設定がおかしいみたいです この中の ← PPPoE接続環境の場合はプロバイダから通知されたDNSサーバー(プライマリ)のIPアドレスを指定 プロバイダからもらった情報は サイトのID ISP識別子 パスワード 固定IP です なので固定IPを入れたのですが・・・ プロバイダに問い合わせて、それを入れるべきでしょうか?

  • fsockopenなどについて

    呼び出し元:aaaa.php 呼び出し先:https://bbbbb.jp/php/cccc.php 認証:Basic ユーザー/パス:user/pass メソッド:POST PHP:5.x という前提でfsockopenを使ってaaaa.phpからcccc.phpにPOSTでデータを投げようと考えています。 今回初めてコマンドラインからPOSTをすることになり、いろいろと模索している状況です。PEARやPECL系は入れないみたいなので、fsockopenをつかうことになりました。 aaaa.phpの中身 $POST = "postData"; $request = "POST /php/cccc.php HTTP/.0\n". "Host: https://cccc.jp\n". "Authorization: Basic".base64_encode("dddd:eeee"); "\n". $POST ."\n". "\n"; $fp = fsockopen("ssl://bbbbb.jp",443); fputs($fp,$request); $res=""; while(!feof($fp)){ $res=fgets,4096); fclose($fp); と、こんな感じです(今手書きだったので、このままだとコンパイルエラーになる可能性もありますが、それは無視とします) タイムアウトを15に設定しデバッグしても、それを過ぎてもなんのレスもない状態です。 requestの書き方がまずいんだと思うのですが、どこをどうすればいいのかわかりません。 authを入れない状態だと、resに"</body></html>"というタグが入ってきます。 受け取り側のスクリプトはPOSTで受け取ったものをログに吐き出すだけの単純なものです。 ちょっとつかみづらい内容で申し訳ありません。もし情報が足りなければ捕捉いたしますので、ご教授願います。

    • 締切済み
    • PHP
  • PerlでPHPのfsockopen関数のようなものはありますか?

    phpでは fsockopen関数があり、ターゲット・ポート・エラー番号・エラー文字列・タイムアウトを設定すれば、結果を文字列として取得できます。 これをperlで同じことをさせたいのですが、簡単なサンプルがありましたら教えてください。

  • bind 9.8が正しく動いてくれません。

    先日bind 9.3のインストールについて質問した者です。その後、わりと参考になるサイトが見つかり、なんとかCentOS 6.2に最新版のbind 9.8をインストールすることが出来たのですが、どうもちゃんと動いていないようなので、追加で質問させていただきます。現象としては以下の通りです。構成としては、サーバ上でbind 9.8を稼働させ、ルータのDHCPの設定のDNSサーバ指定欄に、bind 9.8を稼働させているサーバのアドレスを追加して、DHCPで接続したクライアントは自動的に名前解決出来るようにしてあります。 現象1:Windows 7クライアントでDOSプロンプトを立ち上げ、"ping myhost.mydomain.com"(サーバのFQDN)を実行すると、"192.168.1.100"とサーバのインターナルIPアドレスが返ってくる場合と、全く関係ないグローバルアドレスや見つかりませんメッセージが返ってくる場合があり、一貫していない。どういう場合にちゃんとしたインターナルIPアドレスが返ってくるのかも今のところ不明。 現象2:Ubuntu 12.4クライアントでターミナルを立ち上げ、"ping myhost.mydomain.com"(サーバのFQDN)を実行すると、今のところ100%の確率で、"192.168.1.100"とサーバのインターナルIPアドレスが返ってくるのですが、"ssh myname@myhost.mydomain.com"と実行するとConnection Timeoutと言われたり、Name or service not knownと言われたり、Connection refusedと言われたりして、(myhostの部分によってメッセージが異なるのですが全て192.168.1.100に名前解決されるはずのものです。pingはどの場合も動く。)SSH接続ができない。もちろん"ssh myname@192.168.1.100"とやった場合はちゃんと接続できます。 どの辺りが問題なのでしょうか?宜しくお願いいたします。

専門家に質問してみよう