• 締切済み

ネットワークプログラミング

ネットワークプログラミング初心者です。 簡単な接続型チャットプログラムを作ったのですが、なぜかうまいことつながりません。 ネットワークの設定が間違っているのかと思い、デスクトップ遠隔操作ツールを使ってみたところ、realVNCはつなぐことは出来なかったのですが、 LogMeInを使ったら遠隔操作をすることが出来ました。 このような状況からどこが間違っているかわかりますでしょうか? どなたかご教授お願いします。 <環境> Windows Vista HomePremium

みんなの回答

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.3

>私の利用しているプロバイダは固定グローバルIPアドレスサービスと言うものを提供しており、 >先日それに申し込みグローバルIPを取得したのですが、その場合でもルータをいじらなければいけないのでしょうか? そうです。「ルーターの内側は別世界」です。 因みに「グローバルIPアドレスサービス」と言うのは「プロバイダに再接続しても、ルーターのWANアドレスに、常に同じIPアドレスが割り振られる」と言うサービスです。 このサービスを利用しない場合「プロバイダに再接続すると、接続のたびに空いているグローバルIPアドレスを割り振られるので、再接続するたびに、毎回異なるIPアドレスが割り振られてしまう」と言う状態になり、色々と困るのです。(プロバイダに再接続するたびに新しいIPアドレスを相手に教えないとならなくなるので困る) このサービスは「ルーターの外側のWANアドレスが常に一定になる」と言うだけのサービスで「ルーターの内側のローカルIPアドレスは、相手に判らない」のは同じです。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

通常、ルーターの内側は「IPアドレスがローカルIPになっている為、外から見えない」ので、ルーターの外からルーター内のPCに対してコネクションを確立する事は出来ません。 コネクションの確立は「常に、ルーターの内側にあるPCが、外に対して行う」のです。逆は出来ません。 >LogMeInを使ったら遠隔操作をすることが出来ました。 LogMeInは、LogMeIn社のサーバが「橋渡し」をするので「まるで、ルーターの外からルーター内のPCに対してコネクションを確立しているかのような動作をする」ようになっています。 ルーターの内側同士のPCが通信する場合の事を、良く考えてみてください。 全世界から見えているIPアドレスは「ルーターのWAN側IPアドレス1つだけ」です。ルーターの内側にPCが2台あって、それぞれが192.168.0.2、192.168.0.3と言うローカルIPアドレスになっているとします。このPCを、それぞれ「PC1」「PC2」としましょう。 また「別の場所のどこか」も、ルーターがあって、同じように、ルーターの内側にPCが2台あって、それぞれが192.168.0.2、192.168.0.3と言うローカルIPアドレスになっているとします。このPCを、それぞれ「PC3」「PC4」としましょう。 ここで「PC3とPC4がP2Pで通信する」とします。両方は同じローカル・ネットワーク上に居ますから「192.168.0.2から192.168.0.3にコネクション確立を要求するだけ」で済みます。 では「PC1とPC3がP2Pで通信する」と言う場合は? 2台は別々のローカル・ネットワークに居て、どっちもローカルIPアドレスは「192.168.0.2」です。 片方が「相手のルーターのWANアドレスを知っている」としても、その内側に「192.168.0.2、192.168.0.3と言うローカルIPアドレスのPCが2台居る」のまでは知る事が出来ません。 せいぜい出来るのは「相手のWANアドレスに対して、つまり、ルーターに対して、コネクションの確立を投げる」くらいが関の山です。 で、ここで「IPマスカレードの静的ポートマッピングNAT」ってのが威力を発揮します。 例えば、ルーターに「外からポート番号○○○でパケットが飛んできたら、全部、PC3に、つまり、ローカルIPアドレスが192.168.0.2のPCに丸投げしろ」と設定したとします。 ここでPC1が、PC3が繋がったルーターのWANアドレスに対し「ポート番号○○○でコネクション確立したいです」と、PC3が繋がったルーターにパケットを投げます。 すると、PC3が繋がったルーターは、外からポート番号○○○でパケットが飛んできたら、全部、PC3に丸投げするので、PC3に対して「PC1から飛んできた、コネクションの確立要求が届く」事になります。 それに対するPC3からPC1への返答は、ルーターの通常のNAT機能により、ローカルアドレスとグローバルアドレスの変換が行われ、相手に届きます。 このようにして、両方のルーターで「任意の特定のポートを、IPマスカレードの静的ポートマッピングNATに設定する」ことにより「異なるネットワーク上のPC2台が、任意の特定のポートを使って、P2Pを確立する事が出来る」のです。 なお「単にポートを開放しただけ」では、どうにもなりません。ポートの開放だけでは、ルーターが「外から来たコネクション確立要求を、内側に居る誰に渡せば良いのか悩む」ので、内側にいるPCにパケットは届きません。たとえ、内側にPCが1台しか居なくても、です。

kerokk
質問者

お礼

お返事ありがとうございます。 私の利用しているプロバイダは固定グローバルIPアドレスサービスと言うものを提供しており、 先日それに申し込みグローバルIPを取得したのですが、その場合でもルータをいじらなければいけないのでしょうか? お暇がありましたら教えてください。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

通信したい二台は別々にインターネットに繋がっているということでしょうか? だとしたら、ルーターなどのファイヤーウォール機能などによって、 PCから外部への通信(コネクション確立)はできるから、 外部からPCへの通信(コネクション確立)はできない ようになっているのだと思います。 TCP/IP のクライアント(connect する側)はこういう通信環境でも問題ありませんが。 サーバ(listen する側)がこういう通信環境の場合、そのままではまったくコネクションの確立ができません。 LogMeIn は、NAT traversal と呼ばれる種類の技術を使って、 そういった「外から通信できない」はずのPC同士での通信を実現しています。 http://ja.wikipedia.org/wiki/Hamachi NAT traversal では、基本的に、最初の通信確立時には、 「外部からの接続を受け付けるサーバ」が通信の仲立ちをしますので、 そういう別サーバを用意できない場合は使えません。 あとは、出来る手段は UPnP を使って、ルータに外部からの通信確立を許可させるぐらいでしょうか。 http://ja.wikipedia.org/wiki/UPnP

kerokk
質問者

お礼

ご回答ありがとうございます。 ファイヤーウォールの設定が間違っているということですね。 ポート解放チェックサイトにおいて使用するポートが開いていることは確認済みなのですが、 それだけでは不十分なのでしょうか? ポートさえ開いていればOKじゃないかと素人考えながら思っているのですが…。

関連するQ&A

  • ネットワークについての質問

    現在ネットワークプログラミングの勉強をしています。 家のパソコンを遠隔操作するプログラムを組もうと思っているのですが、 現在使っているパソコンにはグローバルIPアドレスは割り当てられておらず、 ポートは1つも開いていないものと思われます。(多分) この場合遠隔操作サーバを作ったとしても外部からはアクセスできないものだと考えていいのでしょうか? また、そうだとしたらサーバに接続するにはグローバルIPとポートの設定以外にすることはあるのでしょうか? 加えてもう一つ、現在の状態では外部ネットワークから私のパソコンへのアクセスは不可能なので、 私のパソコンが不正アクセス(?)されることはありえないと考えていいのでしょうか? 的外れな質問もあるかもしれませんが、どなたかご教授願います。 <環境> Windows Vista Home Premium

  • ネットワークプログラミングを勉強しようとしているのですが。

    プログラミング初心者です。 C言語でWindowsプログラミングを一応学び、それを利用してゲームを作るのと平行してネットワークも勉強しようと思っています。 使おうとしている書籍は"UNIXネットワークプログラミング入門"という書籍で、初めてネットワークプログラミングを勉強しようとしています。 そこでその本の第二章(p32)のチャットプログラムを動作させようとしたのですがうまくできません。ソースコードはhttp://www.gihyo.co.jp/books/support.php/4-7741-1754-4 に置いてあるフォルダのchap2というフォルダにあるコードです。 まずcygwinでサーバのプログラムを動作させてから、cygwinをもう一つ起動させてそちらでクライアントのプログラムを動作させればいいと書いてあると「思う」のですが、動作しません。クライアントのプログラムを動作させても「gethostbyname: Operation not permitted」というメッセージが出て終了してしまいます。 もし、同じ本を使ったことがある方、またはそうでなくても超初心者がしてしまうような間違いや手順足らずなことなどに心当たりがあれば教えて下さい。

  • ネットワークプログラミングを勉強しようとしているのですが。

    プログラミング初心者です。 C言語でWindowsプログラミングを一応学び、それを利用してゲームを作るのと平行してネットワークも勉強しようと思っています。 使おうとしている書籍は"UNIXネットワークプログラミング入門"という書籍で、初めてネットワークプログラミングを勉強しようとしています。 そこでその本の第二章(p32)のチャットプログラムを動作させようとしたのですがうまくできません。ソースコードは​http://www.gihyo.co.jp/books/support.php/4-7741-1754-4​ に置いてあるフォルダのchap2というフォルダにあるコードです。 まずcygwinでサーバのプログラムを動作させてから、cygwinをもう一つ起動させてそちらでクライアントのプログラムを動作させればいいと書いてあると「思う」のですが、動作しません。クライアントのプログラムを動作させても「gethostbyname: Operation not permitted」というメッセージが出て終了してしまいます。 もし、同じ本を使ったことがある方、またはそうでなくても超初心者がしてしまうような間違いや手順足らずなことなどに心当たりがあれば教えて下さい。

  • ネットワークプログラミングで困っています。

    こんにちわ。 今度ネットワーク対戦型ゲームをJavaで作成することになり、現在、それに向けていろいろと勉強しています。その一環として、オンラインチャットのプログラムを文献から見つけてネット上で動かしてみようと思い、いざ実際にやってみました。自分はPCを二台持っていて、一台はASUS製のモバイルノート(UL20A)でOSはWindows7 Home Premium (64bit板)で、もう一台はDell製のホームノート?(Stdio)でOSはWidows Vista Ultimet (32bit版)です。実行したところ、Stdioの方では問題なく動くのですが、UL20Aの方では最後まで動きませんでした。swingを使っていて、画面までは出ますが、そこからネットワークにつなごうとすると停止します。 作成したプログラムは、最初に実行したときにサーバ名を決めてサーバを構築し、その後もう一度実行して、クライアントとなってサーバ名を入力し、その後ニックネームをつけてチャット部屋(?)に入るというものです。これだけですので一台でも一応実行可能です。 細かいプログラムは文献を参考にしていますので、申し訳ありませんがここでは割愛させていただきます。 ちなみに二台とも環境はjdk1.6.0_22で、綜合開発環境のeclipseを使っているのでプログラム自体にはミスはないと思います。そこは文献を参考にして、実際にStdioで動いているので多分大丈夫です。そして同じプログラムをUL20Aで動かそうとすると動かないのです。 さらに、知人のPCを借りて同じプログラムを起動してみたら起動しました。レッツノートのWindowsXP(32bit版)でした。 これらから推測するにどうやらUL20AのPC内の環境が原因ではないかと思っています。 実際にほかのネットワーク関係のプログラムを実行するとやはりUL20Aのみ実行できませんでした。ネットワークが関係ないものは問題なく動くのですが。 そこを調べようと思いいろいろと試行錯誤しましたが、いまいち解決策らしいものが見つからなかったので、この場を使わせていただきました。 個人的にはOSが64bit版である事になにか原因があるのでは?と思っています。 本番のゲーム作成までそこまで時間があるわけではなく、モバイルノートでネットワークプログラミングができないとなるとなかなかの痛手なので、こちらの道に精通している方がいらっしゃったらどうか助言ください。

  • ネットワークプログラミングについて

    過去ログを検索してみて質問:socの秀和システム出版の「Javaネットワークプログラミング」に載っているクライアント・サーバ型のチャットプログラムについての質問がありました。 私も同じ本で学習しているのですが、過去ログの方の例では1台で実行した場合、2台でネットワーク経由で実行した場合両方とも成功していました。 このプログラムをコンパイルして実行してみてもサーバーに接続できませんと出ます。このプログラムを実行するにはどのような環境、コマンド等が必要でしょうか? 私が試している環境はJ2SDKでWindowXP一台でコマンドプロンプトでchatsv.javaとchatcl.java(アプレット)の両方をコンパイルし、chatsvを実行。chatclはHTMLファイルを作り、それを実行するとIPアドレスを指定画面が出るので指定します。通信はSocket通信です。WindowsのIPアドレス(自分)にはpingもしっかり通っています。 あと2台でネットワークを介した起動では、クライアントには上記のWindowsを、fedora core3を使ってサーバープログラムを起動。こちらも同様にchatsvを実行し、apacheにchatcl.htmlを組み込んでいます。windos側、fedora側から実行しても接続できません。こちらもwindowsからIPアドレスを直接指定するとチャットアプレットは見ることはできますし、pingも通ります。 長くなってしまいましたが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ネットワークプログラミングについて

    もしかしたらカテ違いかもしれません もしそうだったらすいません 僕は今ネットワークプログラミングの勉強をしています。 c言語で行なっています 使っている環境はUNIXです ソケットプログラミングをしています。 今POP3サーバへアクセスするプログラムを書いています。 ここで質問です ドメインネームからIPアドレスを参照して サーバへつなぐ場合 hostent構造体へホスト情報を格納して そのメンバである *h_addr_list[] にアドレスが格納されているらしい までは調べました。 複数のアドレスが記憶できるようになっているみたいですが それはなぜなのでしょう? また実際にアドレスを格納した時、複数のアドレスが入っている場合はどれを使って通信すれば良いのでしょうか? よろしくおねがいします

  • ザウルスでプログラミングはできるんですか?

    ザウルス(シャープ製のPDA)そのものを使ってプログラミングは組めるのでしょうか?いわゆるデスクトップ型等の、普通のパソコンでザウルス用のプログラムを組むことは可能のようですが、ザウルスのOS上でプログラムを組めるようなツールはあるのでしょうか?

  • プログラミングについての質問です。

    プログラミングについての質問です。 キーワードを入力すると自動で検索エンジンに投げ、その検索件数(ヒット数)を返す、というプログラムを組みたいと考えています。 プログラミングに詳しくなく、どのようなツールを使ってどうやるのかなどがわかりません。 初心者が上記のようなプログラムを組むのは難しいでしょうか・・・ アドバイスやおすすめのサイトなどがありましたら是非教えてください! 宜しくお願いします。

  • C言語でチャットプログラミングを・・・

    C言語(unix環境)でチャットプログラミングを作りたいのですが、まずは、TCP/IPによるマルチクライアントで簡単なメッセージのやりとりができるプログラムを練習として作りたいと考えています。 そこでサーバにクライアントからメッセージが届いた時点で全クライアントにメッセージを送信(write)し、逐次更新されるようにしたいのですが、クライアント側で常にread関数を呼び出すのは非常に不格好だし、メッセージを入力するといった他の処理ができなくなると思うのです。 何か方法はありますでしょうか? なにぶんネットワークプログラミングは始めたばかりですので初心者向けの解説をお願いします。

  • 遠隔操作するロボットにプログラミングは必要?

    機械、情報ともに初心者です。 教えていただきたいことがあります。 遠隔操作するロボット(例えばラジコンやテレビ)にはプログラムは必要なんでしょうか。 ラジコンにあらかじめ走るコースを走れるように曲がる場所や走る速度などをプログラムして遠隔操作なしで自走する場合はプログラムが必要です。しかしリモコンで「曲がる」や「停止」を操作する場合、あるボタンを押すとその下の機械に電流が流れる仕掛けで発進するなどと プログラムでなく機械(のなかの仕掛け)で走ることが可能だと感じます。 それとも遠隔操作のラジコンにもプログラムが使われているのでしょうか?

専門家に質問してみよう