HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0622
Ponyo[pcbnet2]未だに分からないネットワークのグローバルIPの関係性16解決


Ponyo

リンク

2019/6/22(Sat) 22:09:58|NO.87699


#include "pcbnet2.as" title "UDPマルチキャスト" udpsock soc,3333,1 if stat : dialog "ソケットの作成に失敗しました。",1 : end udpmjoin soc,"224.0.0.1" if stat : dialog "マルチキャストセッションへの参加に失敗しました。",1 : end udpsendto soc,"224.0.0.1",3333 msg="" input msg,240,24,63 button "送信!",*send onexit *bye goto *main *main udpcheck a,soc if a : gosub *recv wait 1 goto *main *send udpput msg,soc objprm 0,"" goto *main *recv sdim buf,64 sdim info,64 udpget buf,64,soc udpinfo info,soc mes "["+info+"]: "+buf return *bye udpclose soc end
https://www.infraexpert.com/study/multicastz03.html でIPを参考にさせたのですが、
友達と↑のサンプルテストプログラムを起動してチャットもどきを実行したのですがメッセージが受信できません。
グローバルIP(?)ローカルIP(?)、そもそもどういうIPを指定してしたらいいのかも分かりません。

ネットワークはサンプルを改造しただけなので、知識も理解もほぼ皆無状態の私ですが
私に分かりやすい説明をお願い致します(._.)



この記事に返信する


リンク

2019/6/23(Sun) 09:23:34|NO.87700

詳しいことはとりあえず抜きにしておいて…。
お友達と Ponyo さんが同じ場所にいて、同じルーターに接続している場合、ローカルIPを使用して接続できます。Windowsのファイアウォールや、セキュリティーソフトのファイアウォールにブロックされる可能性はあります。とはいえ、そこまでネットワークの知識がなくても、だいたいはつながります。
お友達と Ponyo さんが違う場所にいて、それぞれのインターネット接続を使っている場合、グローバルIPを使用する必要があります。また、接続を受ける側(サーバ/ホスト側)は、ポートマッピングという処理を行う必要があります。そうしないと、接続要求がルーターによって破棄されてしまいます。
最近のルーターは、UPNPに対応していると思いますので、以下のツールを使用して、比較的簡単にポートマッピングを登録できます。
http://miniupnp.free.fr/
使い方は、インストールして、パスを通してから、コマンドプロンプトで
upnpc -s
で、自分のろーかるIPとグローバルIPをメモっておきます。その後、
upnpc -a 自分のローカルIP ポート番号 ポート番号 プロトコル(tcpかudp)
とします。詳しいことは全部すっ飛ばしているのであれですが、ポート番号は2回書かないとだめです。
upnpc -a 192.168.0.10 15000 15000 tcp
これで、ポート15000に対するtcp通信を、ルーターがこっちのパソコンに転送してくれます。
使い終わったら、
upnpc -d 15000 tcp
などとして、マッピングを外します。これはポート番号1回でいいです。
これをやったあとでも、ローカル通信のときと動揺、ファイアウォールの制限は受けますので、解除してください。
これでつながらないこともあります。ちょっとオタッキーなことをいうと、お使いのインターネット・プロバイダが、あっちで我々のIPをNATしていたら(グローバルIPが振られていなければ)、我々がどうがんばってもつながりません。
とりあえず、そんな感じです。



リンク

2019/6/23(Sun) 09:28:41|NO.87701

upnpc -a 192.168.0.10 15000 15000 tcp
という例を出しましたが、IPの部分は、 upnpc -s で出てきた自分のローカルIPに変更してください。
まぁ…とりあえず、マンションを想像してください。
ローカルIPは部屋番号(301とか)で、グローバルIPは建物名(スーパーパレス横浜みたいなw)だと思っていただければ結構です。
建物名だけ分かっても、部屋番号まで分からないとドウしようもないってことです。建物(グローバル)に届いたパケットをどの部屋(ローカル)に送ればいいか、仕分けするのはルーターの仕事です。なので、ポートマッピングを登録して、「15000に来たtcp通信は俺のだからな!」と言っているわけです。



Ponyo

リンク

2019/6/23(Sun) 10:34:29|NO.87702

回答ありがとうございます。失礼ですが質問を含めて回答させていただきます。

>お友達と Ponyo さんが同じ場所にいて、同じルーターに接続している場合、ローカルIPを使用して接続できます。Windowsのファイアウォールや、セキュリティーソフトのファイアウォールにブロックされる可能性はあります。とはいえ、そこまでネットワークの知識がなくても、だいたいはつながります。
>お友達と Ponyo さんが違う場所にいて、それぞれのインターネット接続を使っている場合、グローバルIPを使用する必要があります
ローカルIPは"小さいネット"の世界で自分の周辺にある機器と接続...みたいなもので、
グローバルIPが"すごくでかいネット"の世界で互いに機器が離れてても接続できる...という認識でいいでしょうかね?

①ポートマッピング
>また、接続を受ける側(サーバ/ホスト側)は、ポートマッピングという処理を行う必要があります。そうしないと、接続要求がルーターによって破棄されてしまいます。
>最近のルーターは、UPNPに対応していると思いますので、以下のツールを使用して、比較的簡単にポートマッピングを登録できます。
ポートマッピングとは"自分のみ"で行うということでよろしいでしょうか?
仮に私がこういうネット系のアプリケーションを公開してから他の人が使うとなると、ダウンロードした人もポートマッピングをする必要があるのでしょうか?

②ダウンロード
話の内容は大体理解はできました。ですが、ちょっと...恥ずかしいのですが...( *´艸`)
http://miniupnp.free.fr/files/ の所で猫さんが仰ってた「MiniUPnP」のダウンロードを開始して開いたら、
全てソースコードであるんですけど、これは正常ということでいいのでしょうか?(^^;)
でサイトのファイルの説明みたらほぼ全てが source code で...どれをダウンロードすればいいんでしょうか?
本当に申し訳ございません...(._.)



リンク

2019/6/23(Sun) 13:24:12|NO.87709

> ローカルIPは"小さいネット"の世界で自分の周辺にある機器と接続...みたいなもので、
> グローバルIPが"すごくでかいネット"の世界で互いに機器が離れてても接続できる...という認識でいいでしょうかね?

感覚的には、そういうことでいいと思います!私の2番目のレス(NO.87701)も参考にしていただければ。

> ポートマッピングとは"自分のみ"で行うということでよろしいでしょうか?

ちょっとアプリケーションの概略が分からないのでなんともいえませんが、自分がサーバーとなり、誰かに接続してもらう場合には、上記のご理解は正しいです。みんながサーバーを立てることができるような設計にする場合は、サーバーを立てる人は、基本的にはポートマッピングが必要です。

> 仮に私がこういうネット系のアプリケーションを公開してから他の人が使うとなると、ダウンロードした人もポートマッピングをする必要があるのでしょうか?

たとえば分かりやすいところで、最近のオンラインゲームで説明します。特に接続先とかは指定せず、勝手につながりますよね。
あれは、ゲーム会社のスタッフが事前にサーバーを作っていて、そのIPアドレス(あるいはドメイン)が、ゲームのほうにハードコーディングされています。障害が発生したときのために、どこに接続すべきかを事前にどこかに問い合わせたりしているかもしれませんが、どちらにしろ、ユーザーは「サーバーに接続しているだけ」です。
ponyo さんだけが中央集権的に、今の例でいうところの「ゲーム会社の人」になるようなアプリケーションの実装である場合、ユーザーはポートマッピングを気にする必要はありません。通信の仕組み的には、我々がgoogle.comに接続してなにかをググるのと一緒だからです。
しかし、誰でもサーバーを干すとできるような実装にする場合には、サーバーをやる人はポートマッピングが必要ということです。「ゲーム会社の人になれる実装」とは、具体的には、オンライン・モードを開始するときに、サーバーをホストするか、クライアントとして接続するかを選ぶことができるような実装のことを指します。
ライセンスはどうか知りませんが、サーバーを作る前に miniupnpc を pipeexec 的な感じで実行して、自動的にポートマッピングを試みるようなアプリケーションを見たことがあります。
で、 miniupnpc のexeはこれですね。
http://miniupnp.free.fr/files/download.php?file=upnpc-exe-win32-20150918.zip



Ponyo

リンク

2019/6/23(Sun) 14:46:04|NO.87710

回答すいません。またまた質問が多くなってしまうかもしれません...(^^;

>使い方は、インストールして、パスを通してから、コマンドプロンプトで
>upnpc -s
>で、自分のろーかるIPとグローバルIPをメモっておきます。
コマンド①:upnpc-static.exe -s

upnpc : miniupnpc library test client, version 1.9. (c) 2005-2014 Thomas Bernard. Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ for more information. List of UPNP devices found on the network : desc: http://192.168.11.1:50879/gatedesc.xml st: urn:schemas-upnp-org:device:InternetGatewayDevice:1 Found valid IGD : http://192.168.11.1:50879/upnp/control/WANIPConn1 Local LAN ip address : 192.168.11.2 Connection Type : IP_Routed Status : Connected, uptime=1260s, LastConnectionError : ERROR_NONE Time started : Sun Jun 23 14:08:54 2019 MaxBitRateDown : 1000000000 bps (1000.0 Mbps) MaxBitRateUp 1000000000 bps (1000.0 Mbps) ExternalIPAddress = 172.22.1.115 Bytes: Sent: 15721731 Recv: 32812595 Packets: Sent: 69202 Recv: 84894
多分というか絶対だと思いますが上記のコマンドプロンプトの結果から
ローカルIPが192.168.11.2でグローバルIPが172.22.1.115を利用するってことですよね?

>その後、
>upnpc -a 自分のローカルIP ポート番号 ポート番号 プロトコル(tcpかudp)
>とします。詳しいことは全部すっ飛ばしているのであれですが、ポート番号は2回書かないとだめです。
コマンド②:upnpc-static.exe -a 192.168.11.2 56808 56808 tcp

upnpc : miniupnpc library test client, version 1.9. (c) 2005-2014 Thomas Bernard. Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ for more information. List of UPNP devices found on the network : desc: http://192.168.11.1:50879/gatedesc.xml st: urn:schemas-upnp-org:device:InternetGatewayDevice:1 Found valid IGD : http://192.168.11.1:50879/upnp/control/WANIPConn1 Local LAN ip address : 192.168.11.2 ExternalIPAddress = 172.22.1.115 InternalIP:Port = 192.168.11.2:56808 external 172.22.1.115:56808 TCP is redirected to internal 192.168.11.2:56808 (duration=0)
ポート番号とは [例]https://www.cman.jp/network/support/go_access.cgi で通信ポート(REMOTE_PORT)の所で出てきた数字以外だと
エラー。...というより正常な動作にしなくなるんでしょうか?それともそのIPならポートは自由に使えるということでいいのでしょうか?

本当にすいません(^^;)



リンク

2019/6/23(Sun) 17:39:30|NO.87712

コマンドの書き方は合っていて、ポートマッピングも成功しています。まずはおめでとうございます!
で、あそこに書いてあるリモート・ポートというのは、ポートマッピングとは意味がぜんぜん違います。「cman.jpに接続するために、たまたまそのポート番号を使いましたよ」というだけの話で、ポートマッピングとは関係がありません。
https通信の場合、サーバー側は443番ポートで接続を待ち受けますが、接続するほうは、どのポートを使っても問題ないことになっています。で、この場合、Windowsは勝手にポートを選択しています。
こっちから送っているので、こっちのポートマッピングは関係ありません。繰り返しますが、あくまでポートマッピングが必要な理由は、ルーターに届いたパケットを、同じネットワーク内のどのマシンに送ればいいかがそのままでは分からないからであって、接続を待ち受けるほうのみに必要な作業となります。
自分のポートマッピングが成功しているか(もっと正確には、自分のマシンが外部からアクセスできる状態にあるかどうか)を確かめるには、これを使ってください。
https://www.cman.jp/network/support/port.html
なお、ポートマッピングをしただけでは成功しません。ご自分のアプリケーションをサーバーホスト状態にして、接続を待ち受けている状態で立ち上げてから、上記のチェックをしてください。pcbnet2は分かりませんが、 hspsock でいえば、 sockmake して、 sockwait でぐるぐる回っている状態にしてください。



Ponyo

リンク

2019/6/24(Mon) 19:50:24|NO.87729

返信が遅くなり申し訳ありません。
>コマンドの書き方は合っていて、ポートマッピングも成功しています。まずはおめでとうございます!
ありがとうございます。少し不安でしたが成功して良かったです(^^;)
>で、あそこに書いてあるリモート・ポートというのは、ポートマッピングとは意味がぜんぜん違います。「cman.jpに接続するために、たまたまそのポート番号を使いましたよ」というだけの話で、ポートマッピングとは関係がありません。
>https通信の場合、サーバー側は443番ポートで接続を待ち受けますが、接続するほうは、どのポートを使っても問題ないことになっています。で、この場合、Windowsは勝手にポートを選択しています。
ということはネット系の関数でのポートのパラメータの設定はシステムを意識しないで
指定しても何も不具合は起きないということでしょうかね。
>自分のポートマッピングが成功しているか(もっと正確には、自分のマシンが外部からアクセスできる状態にあるかどうか)を確かめるには、これを使ってください。
>https://www.cman.jp/network/support/port.html
>なお、ポートマッピングをしただけでは成功しません。ご自分のアプリケーションをサーバーホスト状態にして、接続を待ち受けている状態で立ち上げてから、上記のチェックをしてください。pcbnet2は分かりませんが、 hspsock でいえば、 sockmake して、 sockwait でぐるぐる回っている状態にしてください。
で、ポートマッピングは成功していて接続を待ち受けている状態なのですが(ぐるぐるさせているのですが)
外部からのアクセスでは成功できませんでした...(._.)
どういう原因か分からないですが猫さんから頂いた知識で問題を乗り越える予定です。
ここまで本当にありがとうございます!

(外部アクセス成功となったら解決させて頂きます)



Ponyo

リンク

2019/6/24(Mon) 20:14:29|NO.87730


#include "hspsock.as" // *** グローバルIPの取得 *** // ;ipget ;System_Select_Server = refstr System_Select_Server = "182.171.252.153" System_Select_Port = 3000 System_Select_Address = ( System_Select_Server + ":" + System_Select_Port ) // *** サーバーの構築 *** // sockopen 0, System_Select_Server, System_Select_Port sockmake 0, 3000 onexit *_OnExit // *** 接続待機 *** // repeat sockwait 0 _stat = stat if ( _stat == 0 ) { break } redraw 0 color 255, 255, 255 boxf color 0, 0, 0 pos 0, 0 mes System_Select_Address + " STAT:" + _stat redraw 1 await 16 loop dialog "構築完了", 0, System_Select_Address stop // *** 終了時 *** // *_OnExit sockclose end



Ponyo

リンク

2019/6/24(Mon) 20:15:51|NO.87731

pcbnet2は使ったことがあるのですが、hspsockの方の知識はほぼ皆無状態なので
ソースコードが原因だと思いますが...それでも理解は難しいですw(^^;)



リンク

2019/6/25(Tue) 09:37:56|NO.87736

ポート番号ですが、勝手に選ばれるのはこっちから接続するときだけなので、サーバーを立てるときは、多少意識する必要があります。2000より上を使えばまあだいたい問題ないかと。
で、ちょっともう行かなきゃいけなくて流し読みなんですが、実験用のhspsockのスクリプトがなんか不思議なことになってる気がします。
サーバーで接続を待つことと、クライアントとして接続することの区別はついていますか?
ここがひっかかっているのか、単純にhspsockを使ったことがないからなのか、どっちだろうと思ってます。
時間あったら、テスト用スクリプト作ります。あったらw



リンク

2019/6/25(Tue) 15:36:24|NO.87739


#include "hspsock.as" System_Select_Server = "127.0.0.1" System_Select_Port = 3000 System_Select_Address = ( System_Select_Server + ":" + System_Select_Port ) dialog "サーバーを構築しますか?\"いいえ\"を選ぶと、クライアントモードになります。",3 isServer = stat==6 onexit *_OnExit if isServer:{ gosub*_server }else{ gosub*_client } *_onexit sockclose 0 end *_server /* サーバー側の処理 */ sockmake 0,System_Select_Port repeat sockwait 0 _stat = stat if ( _stat == 0 ) { break } redraw 0 color 255, 255, 255 boxf color 0, 0, 0 pos 0, 0 mes System_Select_Address + " STAT:" + _stat redraw 1 await 16 loop dialog "接続が確立しました。通信可能です。テストを終わります。", 0, System_Select_Address return *_client sockopen 0, System_Select_Server, System_Select_Port _stat=stat if _stat!=0:{ dialog "接続できませんでした。",,"だめ" }else{ dialog "接続できました。テストを終わります。",,"できた" } return



Ponyo

リンク

2019/6/27(Thu) 22:17:10|NO.87758

家庭の事情で返信が遅くなりました。すいません(^_^*)
少しの間HSPというよりパソコンがいろいろあって修理するので顔を出すのは
パソコンではしばらく先です...自分勝手で最後まで付き合ってもらい本当すいません...😊
サンプルだけ保存しましたので、とりあえず勝手ながら(パソコンを)休ませていただきます。
しつこいですが本当にありがとうございます。



Ponyo

リンク

2019/7/20(Sat) 08:28:27|NO.87893

久しぶりの投稿です。長らくお待たせしました。申し訳ございません(^^;)
すこし気になったところがあるのですが、グローバルIPが取得できるということなので、
http://hsp.tv/play/pforum.php?mode=pastwch&num=5077#5102

自分のIPで個人サーバーを建てられる(?)ということができると推測しました。
なにいってんだこいつ。と思われるので画像を用意しました。...余計に分かんないかも(^^;)
https://imgur.com/a/ZnpDGu0 (ペンタブを使ってないのは内緒です)

まぁ目的としては、あるアプリケーション全体専用のサーバーに入ってアレコレするのではなく
そのアプリケーションの中の個人専用(完全独立)サーバーを立てたいです。

で、その願望の質問なのですがグローバルIPを利用するのにサーバー主はポートマッピングをする必要がありますが、
個人個人でいちいち自分のサーバーを開く際に、利用するユーザー皆様がこれもいちいちポートマッピングをする必要があるのでしょうか?
もしくはそんなことはできないでしょうか?

久しぶりの投稿でいろいろ書き込ませて頂きます。本当に申し訳ございません(._.)



advdx

リンク

2019/7/20(Sat) 22:05:45|NO.87903

たぶん必要です
マッピングやマスカレードが必要



Ponyo

リンク

2019/7/21(Sun) 09:51:57|NO.87904

>advdxさん
結構めんどくさそうですね。マスカレードについても調べさせていただきます。
情報提供ありがとうございます!



Ponyo

リンク

2019/7/25(Thu) 23:34:20|NO.87942

またまた返信が遅くなり申し訳ありません。いろいろ調べてきました。とりあえず分かったことは、

個人サーバーじゃなくてアプリケーション全体サーバーを立ててプレイヤー管理を行う。
サーバーは自分で建てるか、レンタルかなんかで行ってそのグローバルサーバーのIP(?)から遠距離送信受信を行う。
まず環境を整えないといけないらしいですね。多分猫さんのスクリプトで接続可能?友人PCでできたらしい...

そしてadvdxさんのマスカレードについても調べさせてもらいました。
IP情報を全て専用IPに変換をさせる。みたいなもんですかね。

まだまだネットワークについては未熟ですが、また質問する時にサポートしていただけると嬉しいです(^^;)
猫さん、advdxさんここまで本当にありがとうございました。



ONION software Copyright 1997-2025(c) All rights reserved.