P2P通信について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Mr.D

P2P通信について

#1

投稿記事 by Mr.D » 14年前

Winsockを使用してチャット等の通信を作成しています。

ローカルネットワーク上でのPC二台でやり取りはできるのですが
インターネットを通してやり取りをするとなるとルーターからポートを
開放しなければならないのでUPnPを使用してポートを開放しております。

方法としましては、下記のサイト
GARAさんのページ http://hp.vector.co.jp/authors/VA011804/upnp.htm
を参考にさせて頂きました。

次に、ローカルネットワーク外とのPC間でのやり取りで躓いております。
マッチング?サーバー事態はあるので
双方(2台)のPCのグローバルIPアドレス、サブネット、ローカルIPアドレス(各種ポート)
一通り、通信に必要そうな物は取得(設定)できているのですが

winsock2で単純に
addr.sin_family = AF_INET;
addr.sin_port = 上記で開けたポート;
addr.sin_addr.S_un.S_addr = グローバルIP;
を設定し単純に、
socketA→connect→send
socketB→bind→listen→accept→rect
で、通信できるのではないかとおもっていたのですが
bind等々の戻り値等は正常値が返ってくるのですが、
実際にrectをしてもなんらデータを受信できません。

何がどう駄目で何がどう判らないのかが判らない状態に
陥って居ります。

[PC-A]→[ルーター]→[インターネット]→[ルーター]→[PC-B]
[PC-A]←[ルーター]←[インターネット]←[ルーター]←[PC-B]

を単純に実装?したいのですが
何か参考になるようなサイト若しくは、
こうすれば良いといった事例があれば教えて下さい。

※開発環境は、Windows7 VC++2008(2010)Express

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: P2P通信について

#2

投稿記事 by softya(ソフト屋) » 14年前

とりあえず、PC-AとPC-Bはそれぞれ別のグローバルIPアドレスが必要です。
つまり友人などの協力が必要です。これは大丈夫でしょうか?

それとPC-Aをサーバ、PC-Bをクライアントという単純な形でテストされましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Mr.D

Re: P2P通信について

#3

投稿記事 by Mr.D » 14年前

>とりあえず、PC-AとPC-Bはそれぞれ別のグローバルIPアドレスが必要です。
出来なくもないのですが(自宅と学校)、できれば一か所から
「192.168.1.A」と「192.168.1.B」の同一グローバルIPからの
テストを行いたいのですが不可能でしょうか?

>つまり友人などの協力が必要です。これは大丈夫でしょうか?
可能です。

>それとPC-Aをサーバ、PC-Bをクライアントという単純な形でテストされましたか?
上記にも記載しましたように、ローカル上でのサーバー/クライアント方式でできないものかと
ちょこちょこ右往左往しながらソース、書籍、サイト等と睨めっこしております...

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: P2P通信について

#4

投稿記事 by softya(ソフト屋) » 14年前

Mr.D さんが書きました:出来なくもないのですが(自宅と学校)、できれば一か所から
「192.168.1.A」と「192.168.1.B」の同一グローバルIPからの
テストを行いたいのですが不可能でしょうか?
グローバルIPの空間内で、同じグローバルIP同士でルーティングするようには出来ていないので1つのグローバルIPでは不可能だと思います。

何台もPCを使って擬似インターネットを構築すれば出来るとは思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

Re: P2P通信について

#5

投稿記事 by shiro4ao » 14年前

横レス失礼します。
P2Pに詳しくないですが、よろしくお願いします。

>ローカルネットワーク外とのPC間でのやり取り
 [PC-A]→[ルーター]→[インターネット]→[ルーター]→[PC-B]
この場合で、自宅LAN内にA,Bが存在していて、グローバルIPにて
接続しようとする場合はうまくいかないかもしれません。
接続相手はローカルIPで探してください。
ノードA,Bが同じルータにぶら下がった状態で、グローバルIPによる通信は
難しいと思われます。(実現可能な方法があるかもしれませんが…)

そこで、相手との場所によって接続先の指定方法が変えるのはどうでしょう?
適切な接続方法を教えてくれる中央サーバを持つ、ハイブリッドP2Pによる構築
というかたちになるかとおもいます。
(ピュアP2Pでも大きくは変わらないかと思いますが、話を簡単にするためにハイブリッドで考えてみました)

まずはじめにノードA,Bともに予めグローバルIPをもつインデックスサーバへ接続し
 情報(グローバルIPか、ローカルIPか、UPnPが使えるか等)を伝えておく。

ココからは通信相手の場所によっての場合分けです
i)A,BともにローカルIPを持っている、かつ同一サブネットにいる場合(家庭LAN内のノード間での接続)
 ローカルIPによりノードA-B間を接続する。

ii)A,BともにローカルIPを持っている、かつ同一サブネットにいない場合(学内LANのノード-家庭LANのノード間接続等)
 インデックスサーバはノードB(Aでも構わない)に対してノードAのグローバルIPを教え、
 ノードAに接続するように伝える。
 ノードAに対してUPnPでポートを開けさせてもらう

iii)ノードAはグローバルIPを持ち、ノードBはローカルIPを持っている場合(学内LANのノード-PPPoE接続マシン間等)
 インデックスサーバはノードBに対してノードAのグローバルIPを教え、
 ノードAに接続するように伝える。ノードAに対してUPnPでポートを開けさせてもらう

iv)ノードA、BともにグローバルIPの場合(PPPoE接続マシン間等)
 インデックスサーバはノードBに対してノードAのグローバルIPを教え、
 ノードAに接続するように伝える(どちらが接続する側でも問題はない)


とても的はずれな意見だったら申し訳有りません。

Mr.D

Re: P2P通信について

#6

投稿記事 by Mr.D » 14年前

>グローバルIPの空間内で、同じグローバルIP同士でルーティングするようには
>出来ていないので1つのグローバルIPでは不可能だと思います。
>何台もPCを使って擬似インターネットを構築すれば出来るとは思いますが。
softya(ソフト屋) さん お返事有難うございます。
そうですかぁ、となると自宅と学校とでのリモート操作での
動作確認となるのが必須となるのですね。

>そこで、相手との場所によって接続先の指定方法が変えるのはどうでしょう?
>適切な接続方法を教えてくれる中央サーバを持つ、ハイブリッドP2Pによる構築
>というかたちになるかとおもいます。
>(ピュアP2Pでも大きくは変わらないかと思いますが、話を簡単にするためにハイブリッドで考えてみました)
> ~中略~
>iv)ノードA、BともにグローバルIPの場合(PPPoE接続マシン間等)
> インデックスサーバはノードBに対してノードAのグローバルIPを教え、
> ノードAに接続するように伝える(どちらが接続する側でも問題はない)
shiro4aoさん お返事有難うございます。
当方のイメージですと shiro4aoさんの上げられてる iv) がイメージ通りとなっております(繋げる意味で)

それを踏まえて、プログラム(コード)を書く際に、
どのように書けばいいのかで悩んでいる?状態です。
通信部分のプログラムを書くのは今回が初めてで
Geekなぺーじ さん の http://www.geekpage.jp/programming/
サイトに記載してある程度のコード類(アルゴリズム的な概念が少々)しか知識がありません。

それを踏まえた上で、参考になる例題的(ソース等記載してあるサイト等)な物は無いでしょうか?

説明下手でうまく伝えれなくてお手数かけます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: P2P通信について

#7

投稿記事 by softya(ソフト屋) » 14年前

あれから考えてみたのですが、ハブx1、ルータx2、PCx2があれば擬似的に接続テストはできそうです。
PC-A→ルータA→ハブ→ルータB→PC-Bで出来ませんかね?
試したこと無いし、ネットワーク技術者でも無いので断言はできません。
ルータには擬似グルーバルIPを固定で割り当てます。

それとグローバルとローカルで出来ているなら差はないはずです。
パケットは、wireshark.exeなどで確認したほうが良いと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Mr.D

Re: P2P通信について

#8

投稿記事 by Mr.D » 14年前

softya(ソフト屋) さん お返事ありがとうございます。

>あれから考えてみたのですが、ハブx1、ルータx2、PCx2があれば
>擬似的に接続テストはできそうです。
>PC-A→ルータA→ハブ→ルータB→PC-Bで出来ませんかね?
>試したこと無いし、ネットワーク技術者でも無いので断言はできません。
>ルータには擬似グルーバルIPを固定で割り当てます。

設備的にはあるのですが「擬似グルーバルIP」を割り振る点で
知識外に行くので露頭に迷いそうなので控えます。
可能性としては試してみたいとは思います。

>それとグローバルとローカルで出来ているなら差はないはずです。
>パケットは、wireshark.exeなどで確認したほうが良いと思いますが。

通信部分については問題なさそう?なので、グローバルIP*2での
通信確認を本日にでも行ってみます。(自宅と学校で)
パケットについては「wireshark」で確認しておりますが、
解説サイトを見て 何とか見れてる?程度なので自身もありませんが
引き続きがんばってみます。
長々と説明不十分にも関わらず御付き合い頂きありがとうございました。
此方で一旦 解決とさせて頂きます。

Mr.D

Re: P2P通信について

#9

投稿記事 by Mr.D » 14年前

追記:
自宅と学校で、グローバルIP同士での通信は無事に成功致しました。
当方が深く考え過ぎていたようでした。

閉鎖

“C言語何でも質問掲示板” へ戻る