C++でsocketプログラミングを行う際の接続エラー「No route to host」の解決方法

このQ&Aのポイント
  • C++でsocketの練習のためにサーバクライアントプログラムを作成したが、クライアントがサーバへの接続で「No route to host」というエラーメッセージが表示される。
  • サーバを起動させている状態で「telnet localhost 9999」とすると正しく接続できるが、localhost当てに接続しようとすると接続できない。
  • localhostで接続する場合は特別なソケット操作が必要になる可能性がある。
回答を見る
  • ベストアンサー

socketプログラミングについて

C++でsocketの練習のためにソケットを開き、文字列の送信を行うだけのサーバクライアントプログラムを作成したのですが、どうも上手く動作してくれません。 クライアント→サーバへ文字列を送信する前に、 1.サーバがソケットを開き、9999ポートでアクセスを待つ 2.クライアントがソケットを作成し、サーバの9999ポートにアクセスする 3.クライアントが文字列をサーバへ送信し、サーバが文字列を表示 ということをしたいのですが、2の部分でつまずいています。 プログラムをネットワークに接続されているコンピュータ上で実行すると動作するのですが、(client 192.168.15.17 9999)単独でサーバ・クライアントを起動させ、localhost当てに接続(client localhost 9999)しようとしても「No route to host」と表示されて、接続すら出来ません。 ためしにサーバを起動させている状態で「telnet localhost 9999」とするとどうやらサーバに接続されているようです。 localhostでやる場合は特別なソケット操作が必要になるのでしょうか?

  • ryo-3
  • お礼率64% (146/226)

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

  • ベストアンサー
  • betagamma
  • ベストアンサー率34% (195/558)
回答No.1

localhostではなく、127.0.0.1ではどうでしょうか? localhostは127.0.0.1の別名ですが、自分でプログラムをおつくりになっているのなら、localhostという文字列をIPアドレスに変換する作業をしないといけないと思うのですが。 telnetはlocalhostでいくようですので、おそらく、そこの問題なのではないかと思います。

ryo-3
質問者

補足

回答ありがとうござます。 投稿したあとに追記し様と思ったのですが、できずに・・・ 127.0.0.1で試したのですが、 localhostでは「No route to host」 127.0.0.1では「Connection refused」 自IPを192.168.1.2にして接続しようとして「Connection refused」 上記だけはプログラムミスだと思うのですが、 ネットワークにつなげた192.168.1.3のクライアントから自IP192.168.1.2のサーバに接続するときちんとつながり動作します。 不思議なのですが、どのような対処法があるのでしょうか?

その他の回答 (2)

  • rasuxo
  • ベストアンサー率66% (6/9)
回答No.3

素朴な疑問なのですが 同一PC上に、サーバとクライアントが同居しているんですよね? ポート番号をクライアント側とサーバ側で別けてみてはどうでしょうか? 同じポートリソースを使おうとしていることが原因かも あと、UDPですか?TCPですか? 恐らくTCPでしょうか?

ryo-3
質問者

補足

ポートを空けて待っているのはサーバ側だけです。 サーバは9999で待ち受け、クライアントが9999にアクセスしにいくという具合です。 TCPを使用してソケット作成を行っていました。 こちらも説明不足ですいませんでした。 いろいろと調べたり手探りでソースを変えたりして無事解決することが出来ました。 どうもありがとうございました!

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

ネットワークに接続されていないことで、必要なサービス、デーモン類が動いていないような気がします。 単独で動作させたというのは、どのようなOS,マシンでどうやって実行させたのでしょうか。 多分、ケーブルを外したマシンで単独で動かすなら動くと思いますが。

ryo-3
質問者

補足

ご返答有難うございます。 始めはネットワーク整備がなされた学校でのSolarisを用い、単一コンピュータ上でサーバ/クライアントの同時起動と正常動作を確認しました。 のちにFreeBSDで動作確認を行ったところ上記のような不具合が起こってしまいました。 説明不足で申し訳ありません。 いろいろと調べ、手探りでソースを変更した結果、どうやらSolaris上ではポート番号をhtons(port)としなくても動作するようでした。 その点でFreeBSDでは不具合が生じていたようです。 どうもありがとうございました!

関連するQ&A

  • Socket プログラミングについて

    先日の質問ではありがとうございました。 今回はソースコードについてですが もしよろしければアドバイスお願いします。 Socket 制御を行うアプリを作成しています。 ・クライアントアプリ ・サーバアプリ の2つから構成していまして同PC上で動作させます。 クライアントから localhost 経由でサーバアプリに接続。 サーバアプリは ServerSocket を生成して accept しています。 サーバアプリで accept により Socket を生成すると その Socket を Thread に引き渡して適宜処理を行います。 その後、 再び別クライアントからの接続を待つために サーバアプリで accept したいのですが そのまま accept を呼び出しても そこで待機せずに新しい Socket を生成しています。 別クライアントからの接続を待機するにはどうしたらいいのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java
  • JavaのSocketで、データを送ったのに応答が

    JavaのSocketで、データを送ったのに応答がありません。 iPod touchで、データを送ったらオウム返しのように送られてきたデータをそのまま返すプログラムを実行しました。 パソコンのJavaでソケット通信を行い、接続とウェルカム文は表示できました。 しかし、データを送ったのに帰ってきません。 おかしいので、telnetで確認したところ、うまく作動しました。 となると、telnetではうまくいき、javaのソケットではうまくいかない…javaが原因と思います。 telnetとjavaのソケットとでは、何か違いがありますか? javaでは、入力された文字列をそのまま送信しています。エンコードや何かが必要ですか?

    • ベストアンサー
    • Java
  • Socket通信を待ち受け状態にするには

    Androidアプリの開発でJavaのSocketを使って通信しようと考えています。 現在、ソースが手元にない状態なのですが、 SocketDebuggerをサーバとして、クライアントプログラムを書きました。 流れは、指定のポート、アドレスに接続して入力された文字列をサーバが受け取り、 メッセージを返信するものです。 なのですが、サーバ側から再度メッセージを送信したときに今度はクライアント側で 受け取りそれにまた返信する…ということをやりたいのですが、今の状況ではサーバからのメッセージを受け取ることが出来ません。 プログラムは以下のサイトを参考にして少し書き換えました。 http://team-pag.interprism.co.jp/member/okazawa/blog/?p=687 今のままだとクライアント側から送信するとそのまま接続が終了してしまうのですが、 たとえば「exit」を受け取ったら接続をやめる、、それまではサーバからのメッセージも受け取れる状態にする…というようにやりたいです。 ご教授お願いします!!

  • ポートを使用しているアプリケーションを調べられますか?

    Apaheをインストールしたのですが起動できません。 どうやら、すでに別のWWWサーバーが起動しているか ポートが使用されているようです。。 ↓ telnet localhost 80 telnet localhost 443 としてエンターを押すと、文字化けした文字が 返ってきます。文字化けしている為、何が 悪さをしているのか検討もつきません。 80や443を使うようなサービスが見当たらず ポートを開放できず困っています。 どうしたら良いでしょうか?

  • UDPのソケットプログラミング

    ソケットプログラミングでの質問です. 初心者です. UDPクライアントで sock = socket(PF_INET,SOCK_DGRAM,0) でUDPソケットを生成した後に bind()なしで,UDPサーバ宛にsendto() を行った場合, サーバのrecvfrom()でクライアントの IPアドレスとポート番号が受け取ることができると思いますが ここでのIPアドレスはクライアントのアドレスで, ポート番号は他のクライアントの他ソケットが使用していないポート番号 が受け取ることができると考えてよろしいですか? クライアントのsendto()で自動的にポート番号が割り当てられるが, クライアントが,どのポートから送信したのかを知る方法はないですか?

  • telnetがうまくいかない?

    ネットワークの知識を得ようと、ある本を読んでいるのですが、その中でtelnetについて理解しようということで、「telnet localhost 25」と指定してみよう、とあるのですがVistaだからかどうか分かりませんが、下記のようにでて失敗してしまいます。 Microsoft Telnet> open localhost 25 接続中: localhost...ホストへ接続できませんでした。 ポート番号 25: 接続に失敗しました うまくいく方法はあるでしょうか?一応下記のURLを見て、Telnetクライアントとサーバの設定はしてあります。 http://www.atmarkit.co.jp/fwin2k/win2ktips/960vistelnet/vistelnet.html

  • チャットプログラミング

    簡単な接続型チャットプログラムを作っています。 サーバとクライアントをTCPを使って接続し、1対1でメッセージを送りあうというものなのですが、 自宅にPCが一台しかないのでサーバ、クライアントを同じPCで起動してテストしています。 クライアントで接続相手を指定するとき、自PCのローカルアドレスを入力すると、正常に動作するのですが、 グローバルアドレスを入力すると正しく接続できません。 ポート開放についてはhttp://www.akakagemaru.info/port/tcpport.phpのサイトで確認済みです。 パーソナルファイアウォールの設定も済んでいるはずです。 どこがいけないのでしょうか? <環境> Windows Vista VC++ EE

  • ネットワークに繋がらない

    よろしくお願いいたします。 HP-UX UNIXサーバーを使用しているのですが、 先日、端末を再起動させたところ、 クライアント(WindowsXP)からアクセスできなくなってしまいました。 色々調べてみたのですが、 原因がわかりません。 ・サーバーに対してのpingは通ります。 ・サーバー上ではsambaも起動しています。 ・クライアントからのアクセス(web=[http://サーバー名:901/]や、TeraTerm=Telnet接続)ができません。 ・LANケーブル、ポートの差し替えを行いましたが、つながりません。 問題となり得る可能性は何でしょうか? ご教授いただけないでしょうか?

  • ソケット通信におけるコントローラの作成

    こんにちは.いつもお世話になっています. 質問なのですが,現在ソケット通信でサーバプログラム,クライアントプログラムで通信し,文字列をやり取りするプログラムを作成しました. このクライアントプログラムは3つあり,3つのプログラムすべてがサーバに接続されるとサーバが文字列を返す仕組みになっています. そこで,この三つのプログラムが別々のPC上に乗っている場合に三つのプログラムを一つのコントローラプログラム(一台のPC)上から起動あるいは通信させられるようにプログラムを作りたいと思っています. 例えばコントローラプログラムを起動すると,1:プログラムAを起動,2:プログラムBを起動,3:プログラムCを起動,という選択肢が表示され,1を選択すると別PC上のプログラムAが起動する,という方式です.実際にはプログラムAの起動は手作業で行って,通信の開始だけをコントロールできる方式でも構いません. 考えとしてはクライアントプログラムが定期的にサーバプログラムと通信を行っていて,サーバプログラムがコントローラプログラムから命令を受け取ったらフラグを立て,そのフラグをみてクライアントプログラムが通信を開始する,というものなのですがどうもうまくいきません.(定期通信が実現できません) どうすればこのような構成を実現できるでしょうか? ご教授お願いします.

  • MUAの使うポートを教えて下さい。

    スミマセン。混乱したので、教えて下さい。メーラーはメール受信の際サーバのPOP3(110)ポートもしくはIMAP(143)ポートにアクセス。 送信の際はサーバーのSMTP(25)ポートにアクセスすると事ですが、送信元(クライアント)のポート番号は何になっているのでしょうか? HTTPみたいにランダムな番号ですか? それとも、Telnet(23)でアクセスしているのですか? それとも同じポートで・・・・。 とにかく混乱しています。ご教授お願いします。

専門家に質問してみよう