他マシン接続
Re:他マシン接続
えっと、質問の具体化が違反してるのかな・・・?
DXライブラリ置き場リファレンスページで、
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = 192 ;
Ip.d2 = 168 ;
Ip.d3 = 5 ;
Ip.d4 = 227 ;
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
といったプログラムがあったのですが、192.168.で始まるIPはプライベートアドレスで、通信に使うものだったかなと疑問に思ったので質問しました。
自作しているゲームに通信対戦機能を付けたいので、知りたいです
DXライブラリ置き場リファレンスページで、
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = 192 ;
Ip.d2 = 168 ;
Ip.d3 = 5 ;
Ip.d4 = 227 ;
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
といったプログラムがあったのですが、192.168.で始まるIPはプライベートアドレスで、通信に使うものだったかなと疑問に思ったので質問しました。
自作しているゲームに通信対戦機能を付けたいので、知りたいです
Re:他マシン接続
ざっと見たところ,少なくとも「デュエル・オブ・レジェンド」はC/S方式ですね。
つまり,クライアントは全てゲームサーバーに接続しにいっています。
Games for Windows Liveが開放されていればそれを使えるのですが,
現状ではXbox Liveという形で,XBox360でXNA経由で使うか,
またはWindows上にXNA開発環境を整えるしかないです (Xbox Liveを使うためのライブラリは再頒布禁止)。
# MSと契約するという方法もありますが,それは除外。
というわけで,原則的には
・サーバーを用意してC/S方式で作る
→サーバーを借りるにせよ自宅に用意するにせよ,サーバーサイドのプログラミングが必須
→自宅でWindowsを使う場合,Windowsのライセンスに注意
→クライアント側での設定は不要
・サーバーを用意せず,P2P方式で作る
→ファイアウォールやルータのポート設定が,少なくとも片方のクライアントで必須
→C/Sより作成上の負荷が少ない (LAN内の延長で済む)
の2案になります。
つまり,クライアントは全てゲームサーバーに接続しにいっています。
Games for Windows Liveが開放されていればそれを使えるのですが,
現状ではXbox Liveという形で,XBox360でXNA経由で使うか,
またはWindows上にXNA開発環境を整えるしかないです (Xbox Liveを使うためのライブラリは再頒布禁止)。
# MSと契約するという方法もありますが,それは除外。
というわけで,原則的には
・サーバーを用意してC/S方式で作る
→サーバーを借りるにせよ自宅に用意するにせよ,サーバーサイドのプログラミングが必須
→自宅でWindowsを使う場合,Windowsのライセンスに注意
→クライアント側での設定は不要
・サーバーを用意せず,P2P方式で作る
→ファイアウォールやルータのポート設定が,少なくとも片方のクライアントで必須
→C/Sより作成上の負荷が少ない (LAN内の延長で済む)
の2案になります。
Re:他マシン接続
こんばんは。
>>192.168.で始まるIPはプライベートアドレスで
>>通信に使うものだったかなと疑問に思ったので質問しました。
私も、その辺り少しずつ勉強中なので勘違いがあったら何方か
ご指摘・ご指導の程お願い致します。(_ _)
プライベートアドレスは、ルーターの内側(LAN内)で設定される ---←修正部位---
各パソコンに割り当てられる、アドレス(IP)です。 ---←修正部位---
例えば、1台のパソコンからルーターを通して、インターネットに接続してる場合は
LANに接続されてるパソコンは1台ですので
192.168.?.2 (? は、半角数字)の様に
ルーターが勝手に、IPアドレスを指定します。(OSが勝手に指定してるのかもしれません。)
その後、2台目のパソコンを繋ぐと、192.168.?.3 の様に、末尾の数字が変更されます。
OSによって違うと思うのですが、自分のIPアドレスを確認するには
Windowsでしたら、コントロールパネルのネットワーク関連の項目内を探すと
自分のIPアドレスを表示される画面が出てくると思います。
例:Win XP(pro)でしたら、スタート→マイネットワーク→ネットワーク接続を表示する
→ローカルエリア接続をクリック
すると、左下辺りにIPアドレスが表示されます。
このアドレスが、プライベートアドレスです。
グローバルアドレス(IP)ですが、このアドレスは契約されたプロバイダから割り当てられる
プロバイダに接続するためのアドレスで、加入したプロバイダによって異なります。
グローバルアドレスは、プロバイダへの接続が切断されると・・・
LANを通さずに、パソコンからプロバイダに直に接続してる場合は
プロバイダに再度接続した時に(たぶん末尾の数字?のみ)変更される可能性がありますし
偶然、同じアドレスになる場合もあります。
LANを通してプロバイダに接続していても
プロバイダ側での回線落ちや、LANの電源が落ちてしまった場合などは
固定グローバルアドレス以外は、アドレスが変更される場合があります。
これも偶然、アドレスが同じ場合もあります。
適当に試行錯誤しながらルーターの設定をすれば、ポート設定はできるかと思うのですが
セキュリティー上、かなりの問題が出てくると思います。
自分のパソコン内で、自作のオンラインゲームを公開するとなると・・・。^^;
もし、LAN経由でインターネットに接続されているのでしたら
可能でしたら、そのLANにパソコンを2台接続してみて
深黒さんがNo:54306で掲示されたソースを実行してみて下さい。
そこで
// IPアドレスを設定( ここにある4つのIP値は仮です )
の部分を、いじってみると解るかもしれません。^^
>>192.168.で始まるIPはプライベートアドレスで
>>通信に使うものだったかなと疑問に思ったので質問しました。
私も、その辺り少しずつ勉強中なので勘違いがあったら何方か
ご指摘・ご指導の程お願い致します。(_ _)
プライベートアドレスは、ルーターの内側(LAN内)で設定される ---←修正部位---
各パソコンに割り当てられる、アドレス(IP)です。 ---←修正部位---
例えば、1台のパソコンからルーターを通して、インターネットに接続してる場合は
LANに接続されてるパソコンは1台ですので
192.168.?.2 (? は、半角数字)の様に
ルーターが勝手に、IPアドレスを指定します。(OSが勝手に指定してるのかもしれません。)
その後、2台目のパソコンを繋ぐと、192.168.?.3 の様に、末尾の数字が変更されます。
OSによって違うと思うのですが、自分のIPアドレスを確認するには
Windowsでしたら、コントロールパネルのネットワーク関連の項目内を探すと
自分のIPアドレスを表示される画面が出てくると思います。
例:Win XP(pro)でしたら、スタート→マイネットワーク→ネットワーク接続を表示する
→ローカルエリア接続をクリック
すると、左下辺りにIPアドレスが表示されます。
このアドレスが、プライベートアドレスです。
グローバルアドレス(IP)ですが、このアドレスは契約されたプロバイダから割り当てられる
プロバイダに接続するためのアドレスで、加入したプロバイダによって異なります。
グローバルアドレスは、プロバイダへの接続が切断されると・・・
LANを通さずに、パソコンからプロバイダに直に接続してる場合は
プロバイダに再度接続した時に(たぶん末尾の数字?のみ)変更される可能性がありますし
偶然、同じアドレスになる場合もあります。
LANを通してプロバイダに接続していても
プロバイダ側での回線落ちや、LANの電源が落ちてしまった場合などは
固定グローバルアドレス以外は、アドレスが変更される場合があります。
これも偶然、アドレスが同じ場合もあります。
適当に試行錯誤しながらルーターの設定をすれば、ポート設定はできるかと思うのですが
セキュリティー上、かなりの問題が出てくると思います。
自分のパソコン内で、自作のオンラインゲームを公開するとなると・・・。^^;
もし、LAN経由でインターネットに接続されているのでしたら
可能でしたら、そのLANにパソコンを2台接続してみて
深黒さんがNo:54306で掲示されたソースを実行してみて下さい。
そこで
// IPアドレスを設定( ここにある4つのIP値は仮です )
の部分を、いじってみると解るかもしれません。^^

Re:他マシン接続
同一ネットワーク内においてはルータからマシンが全部見えているわけですから
ローカルIPアドレスを指定すれば問題なく接続を確立できます。
グローバルIPアドレスでポート設定が必要と言う話は、
通信しようにも、グローバルIPアドレスだけではネットワークの特定はできても接続先のマシンがわからない。
そこで、例えば受け側のルータで
「port ○○番 にきた通信はローカルIPアドレス○○のport○○番に転送する」
といったような処理をすることで接続を確立しています。
・グローバルIPアドレス→外部のネットワークに
・ローカルIPアドレス→ネットワーク内部のマシンに
といった感じの行き先ですので、ConnectNetWork() を使用する場合は、
IPアドレスならなんでもいいということになります。
ポート設定云々は使用者がするものであり、
プログラム開発の点ではどちらもかわりません。
東方非想天則に関しても、LAN内対戦の場合は特にポート設定はいらなかったはずですし
ネットワーク越しの場合はHOST側がポート設定をしているはずですね。
鯖蔵方式でつくるなら、とりあえず簡単なチャットソフトを作ってみたりすると
入門ぐらいにはなると思います(?)。同期を厳しくしなくていいので。
以下超適当な解説。学生でまだまだ勉強中の身なので、
間違っている可能性を念頭に置いて読んでください(笑)。
ミスの指摘は歓迎します。
----------------------------------------------------------------------
IPアドレスとはネットワークの識別子のようなものです。
通常、IPアドレスと言えばローカルIPアドレス(プライベートIPアドレス)か
グローバルIPアドレスのどちらかを指します。
単にIPとだけ言ってしまうとInternet Protocolで意味が違うので注意です。
(と言っても大抵の場合IPと言えば通じますが)。
ローカルIPアドレスを確認したい場合は、
Windowsの場合コマンドプロンプトでipconfigと打ち込めば確認できます。
ローカルIPアドレスは手動で割り当てることもできますが、
LAN接続したマシンに対してDHCPで勝手に割り当てられることが多いです。
最近のルータはDHCPサーバの機能を持っているのがほとんどなのでこれが勝手にやってくれます。
さて、このIPアドレス。
マシン1台につき1つあればこんなややこしいことにはならないのですが
32ビットなので約43億種類しかありません。(IPv6の話はしません)。
こんなんすぐなくなってしまうわ!ということで色々小細工をしています。
とりあえず値はグローバルIPアドレスに使用していい範囲と、
ローカルIPアドレスに使用していい範囲とで分けられています。どちらもIPアドレスです。
ローカルなネットワークに外部から接続しようと思うと住所が必要になります、
これがグローバルIPアドレスです。
例えば、このサイトを私たちが利用する場合はwww.play21.jpにアクセスするわけですが、
これは(現時点では)210.239.46.144というアドレスに対応しており、
そこにコネクションを貼ってデータのやりとりをしているということになります。
外部から見た場合、このネットワーク内に一体どれだけのマシンが
接続されているかなどは一切分かりません。
接続をしに行く側からすればとりあえず入口がわかっていればかまいません。
きっとあちらさんが頑張ってくれます、便利ですね。
ローカルIPアドレスはというと
LAN内でのマシンの識別子のように使われています。
同一ネットワーク内のマシンに接続したい場合は、この値を用いればいいです。
自分自身に接続する場合は、自身のローカルIPアドレスを調べなくても
127.0.0.1とすれば常に自分のことを表します。
----------------------------------------------------------------------------
長々と失礼いたしましたm(_ _)m
ローカルIPアドレスを指定すれば問題なく接続を確立できます。
グローバルIPアドレスでポート設定が必要と言う話は、
通信しようにも、グローバルIPアドレスだけではネットワークの特定はできても接続先のマシンがわからない。
そこで、例えば受け側のルータで
「port ○○番 にきた通信はローカルIPアドレス○○のport○○番に転送する」
といったような処理をすることで接続を確立しています。
・グローバルIPアドレス→外部のネットワークに
・ローカルIPアドレス→ネットワーク内部のマシンに
といった感じの行き先ですので、ConnectNetWork() を使用する場合は、
IPアドレスならなんでもいいということになります。
ポート設定云々は使用者がするものであり、
プログラム開発の点ではどちらもかわりません。
東方非想天則に関しても、LAN内対戦の場合は特にポート設定はいらなかったはずですし
ネットワーク越しの場合はHOST側がポート設定をしているはずですね。
鯖蔵方式でつくるなら、とりあえず簡単なチャットソフトを作ってみたりすると
入門ぐらいにはなると思います(?)。同期を厳しくしなくていいので。
以下超適当な解説。学生でまだまだ勉強中の身なので、
間違っている可能性を念頭に置いて読んでください(笑)。
ミスの指摘は歓迎します。
----------------------------------------------------------------------
IPアドレスとはネットワークの識別子のようなものです。
通常、IPアドレスと言えばローカルIPアドレス(プライベートIPアドレス)か
グローバルIPアドレスのどちらかを指します。
単にIPとだけ言ってしまうとInternet Protocolで意味が違うので注意です。
(と言っても大抵の場合IPと言えば通じますが)。
ローカルIPアドレスを確認したい場合は、
Windowsの場合コマンドプロンプトでipconfigと打ち込めば確認できます。
ローカルIPアドレスは手動で割り当てることもできますが、
LAN接続したマシンに対してDHCPで勝手に割り当てられることが多いです。
最近のルータはDHCPサーバの機能を持っているのがほとんどなのでこれが勝手にやってくれます。
さて、このIPアドレス。
マシン1台につき1つあればこんなややこしいことにはならないのですが
32ビットなので約43億種類しかありません。(IPv6の話はしません)。
こんなんすぐなくなってしまうわ!ということで色々小細工をしています。
とりあえず値はグローバルIPアドレスに使用していい範囲と、
ローカルIPアドレスに使用していい範囲とで分けられています。どちらもIPアドレスです。
ローカルなネットワークに外部から接続しようと思うと住所が必要になります、
これがグローバルIPアドレスです。
例えば、このサイトを私たちが利用する場合はwww.play21.jpにアクセスするわけですが、
これは(現時点では)210.239.46.144というアドレスに対応しており、
そこにコネクションを貼ってデータのやりとりをしているということになります。
外部から見た場合、このネットワーク内に一体どれだけのマシンが
接続されているかなどは一切分かりません。
接続をしに行く側からすればとりあえず入口がわかっていればかまいません。
きっとあちらさんが頑張ってくれます、便利ですね。
ローカルIPアドレスはというと
LAN内でのマシンの識別子のように使われています。
同一ネットワーク内のマシンに接続したい場合は、この値を用いればいいです。
自分自身に接続する場合は、自身のローカルIPアドレスを調べなくても
127.0.0.1とすれば常に自分のことを表します。
----------------------------------------------------------------------------
長々と失礼いたしましたm(_ _)m
Re:他マシン接続
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = ; //ここに
Ip.d2 = ; //自分の
Ip.d3 = ; //グローバルアドレスを
Ip.d4 = ; //入れた
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
このプログラムを友人に渡して、友人宅から起動してもらい、私はDXライブラリにあった
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
int NetHandle , LostHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
IPDATA Ip ; // 接続先IPアドレスデータ
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 接続してくるのを待つ状態にする
PreparationListenNetWork() ;
// 接続してくるかESCキーが押されるまでループ
NetHandle = -1 ;
while( !ProcessMessage() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 新しい接続があったらそのネットワークハンドルを得る
NetHandle = GetNewAcceptNetWork() ;
if( NetHandle != -1 ) break ;
}
// 接続されていたら次に進む
if( NetHandle != -1 )
{
// 接続の受付を終了する
StopListenNetWork() ;
// 接続してきたマシンのIPアドレスを得る
GetNetWorkIP( NetHandle , &Ip ) ;
// データが送られて来るまで待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量が0以外のときはループから抜ける
if( GetNetWorkDataLength( NetHandle ) != 0 ) break ;
}
// データ受信
DataLength = GetNetWorkDataLength( NetHandle ) ; // データの量を取得
NetWorkRecv( NetHandle , StrBuf , DataLength ); // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// 受信成功のデータを送信
NetWorkSend( NetHandle , "繋がったぞ~!!" , 17 ) ;
// 相手が通信を切断するまで待つ
while( !ProcessMessage() )
{
// 新たに切断されたネットワークハンドルを得る
LostHandle = GetLostNetWork() ;
// 切断された接続が今まで通信してた相手だった場合ループを抜ける
if( LostHandle == NetHandle ) break ;
}
// 切断確認表示
DrawString( 0 , 16 , "切断しました" , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
といったプログラムを起動して待ち構えていたのですが、失敗しました・・・
自分や友人にルータ等の設定をしなきゃいけないでしょうか?
・・・こりゃポート開放とか通信対戦以前の問題ですね・・・
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = ; //ここに
Ip.d2 = ; //自分の
Ip.d3 = ; //グローバルアドレスを
Ip.d4 = ; //入れた
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
このプログラムを友人に渡して、友人宅から起動してもらい、私はDXライブラリにあった
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
int NetHandle , LostHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
IPDATA Ip ; // 接続先IPアドレスデータ
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 接続してくるのを待つ状態にする
PreparationListenNetWork() ;
// 接続してくるかESCキーが押されるまでループ
NetHandle = -1 ;
while( !ProcessMessage() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 新しい接続があったらそのネットワークハンドルを得る
NetHandle = GetNewAcceptNetWork() ;
if( NetHandle != -1 ) break ;
}
// 接続されていたら次に進む
if( NetHandle != -1 )
{
// 接続の受付を終了する
StopListenNetWork() ;
// 接続してきたマシンのIPアドレスを得る
GetNetWorkIP( NetHandle , &Ip ) ;
// データが送られて来るまで待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量が0以外のときはループから抜ける
if( GetNetWorkDataLength( NetHandle ) != 0 ) break ;
}
// データ受信
DataLength = GetNetWorkDataLength( NetHandle ) ; // データの量を取得
NetWorkRecv( NetHandle , StrBuf , DataLength ); // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// 受信成功のデータを送信
NetWorkSend( NetHandle , "繋がったぞ~!!" , 17 ) ;
// 相手が通信を切断するまで待つ
while( !ProcessMessage() )
{
// 新たに切断されたネットワークハンドルを得る
LostHandle = GetLostNetWork() ;
// 切断された接続が今まで通信してた相手だった場合ループを抜ける
if( LostHandle == NetHandle ) break ;
}
// 切断確認表示
DrawString( 0 , 16 , "切断しました" , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
といったプログラムを起動して待ち構えていたのですが、失敗しました・・・
自分や友人にルータ等の設定をしなきゃいけないでしょうか?
・・・こりゃポート開放とか通信対戦以前の問題ですね・・・

Re:他マシン接続
ポート番号の指定と、受信側のルータのポートのルーティングを行ってください。
ポート番号は隠しパラメータみたいです(もしかしてローカルIPの接続がデフォルトか?)
extern int ConnectNetWork( IPDATA IPData, int Port = -1 ) ; // 他マシンに接続する
extern int PreparationListenNetWork( int Port = -1 ) ; // 接続を受けられる状態にする
変なポート番号を開けるとパソコンが危機に陥るので適当な番号で開けないでくださいね。
それと通信状態をモニターするのにパケットキャプチャのWiresharkの導入をおすすめします。
ポート番号は隠しパラメータみたいです(もしかしてローカルIPの接続がデフォルトか?)
extern int ConnectNetWork( IPDATA IPData, int Port = -1 ) ; // 他マシンに接続する
extern int PreparationListenNetWork( int Port = -1 ) ; // 接続を受けられる状態にする
変なポート番号を開けるとパソコンが危機に陥るので適当な番号で開けないでくださいね。
それと通信状態をモニターするのにパケットキャプチャのWiresharkの導入をおすすめします。
Re:他マシン接続
インターネットから接続できるかの確認方法です。
まずサーバ側のソフトを起動し
「簡易TCPポートスキャンスクリプト」というサイトで「チェックしたいポート番号」
にソフトで使うポート番号(PreparationListenNetWork()の第一引数)を入れて、
「ポートが開いているかチェックする」をおして
「ポートに接続結果: (・∀・) 成功」
と出てくればインターネット側から接続できます。
「ポートに接続結果: (・A・) 失敗」
と出てくれば、ファイアウォールかルータの設定を見てください。
ファイアウォールに通信を許可してもらい、ルータのポートマッピングの設定で
お使いのポートを、サーバを起動しておくPCに接続するように設定してください。
まずサーバ側のソフトを起動し
「簡易TCPポートスキャンスクリプト」というサイトで「チェックしたいポート番号」
にソフトで使うポート番号(PreparationListenNetWork()の第一引数)を入れて、
「ポートが開いているかチェックする」をおして
「ポートに接続結果: (・∀・) 成功」
と出てくればインターネット側から接続できます。
「ポートに接続結果: (・A・) 失敗」
と出てくれば、ファイアウォールかルータの設定を見てください。
ファイアウォールに通信を許可してもらい、ルータのポートマッピングの設定で
お使いのポートを、サーバを起動しておくPCに接続するように設定してください。

Re:他マシン接続
すみません。もう一つだけ。
深黒さんのNo:54430で掲示されたソースは
送・受信側ともに、そのまま実行されますと
デフォルトの「フルスクリーンモード」にて実行されます。
(以下、ご存知でしたら、ごめんなさい。)
実行すると両方とも、モニター画面の全てが真っ黒になるので
何か警告、例えばウィルス対策ソフトの警告などが出ても、見逃してしまう可能性があります。
ですので、余計なお世話かと思うのですが
送・受信側の両方のソースのそれぞれの、DXライブラリを初期化処理する関数より前で
ChangeWindowMode関数を呼び出し
(前後のソース略)
の様にして実行されると、警告などを見逃す可能性が少なくなると思います。
実は以前私も、このサンプルソースを、ただコピペして実行したにも関わらず
ぜんぜん、うまくいかなかったので大変、悔しい思いをした事を思い出しました。
色々と試行錯誤してみました。
けど、うまく送受信できた時「やったっ!できたぞ~っ!」って
何も解らない嫁に向かって叫んでました。
「あっそう。良かったね。」って、返事はあっさりでしたけど。^^;
色々と頭がごちゃごちゃになるかと思いますが
通信できるまで、どうかあきらめないでがんばって下さい。
応援してます!^^
深黒さんのNo:54430で掲示されたソースは
送・受信側ともに、そのまま実行されますと
デフォルトの「フルスクリーンモード」にて実行されます。
(以下、ご存知でしたら、ごめんなさい。)
実行すると両方とも、モニター画面の全てが真っ黒になるので
何か警告、例えばウィルス対策ソフトの警告などが出ても、見逃してしまう可能性があります。
ですので、余計なお世話かと思うのですが
送・受信側の両方のソースのそれぞれの、DXライブラリを初期化処理する関数より前で
ChangeWindowMode関数を呼び出し
(前後のソース略)
int DataLength ; // 受信データ量保存用変数 ChangeWindowMode(TRUE); //TRUE:ウインドモード・FALSE:フルスクリーンモード(デフォルト) if( DxLib_Init() == -1 )// DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 }(略)
の様にして実行されると、警告などを見逃す可能性が少なくなると思います。
実は以前私も、このサンプルソースを、ただコピペして実行したにも関わらず
ぜんぜん、うまくいかなかったので大変、悔しい思いをした事を思い出しました。
色々と試行錯誤してみました。
けど、うまく送受信できた時「やったっ!できたぞ~っ!」って
何も解らない嫁に向かって叫んでました。
「あっそう。良かったね。」って、返事はあっさりでしたけど。^^;
色々と頭がごちゃごちゃになるかと思いますが
通信できるまで、どうかあきらめないでがんばって下さい。
応援してます!^^
Re:他マシン接続
とりあえずポート開放の方法です。
http://www.akakagemaru.info/port/
ポート開放するのはサーバ側だけで良いので、開放したそのポート番号をConnectNetWork()とPreparationListenNetWork()のパラメータに設定してください。
http://www.akakagemaru.info/port/
ポート開放するのはサーバ側だけで良いので、開放したそのポート番号をConnectNetWork()とPreparationListenNetWork()のパラメータに設定してください。
Re:他マシン接続
うーん、ポート開放は東方非想天則で出来ているつもりだったのですが・・・
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
ChangeWindowMode(TRUE); //TRUE:ウインドモード・FALSE:フルスクリーンモード(デフォルト)
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = ;//ここに
Ip.d2 = ;//相手の
Ip.d3 = ;//IPアドレスを
Ip.d4 = ;//入れてます
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
PreparationListenNetWork(10800 ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
多分・・・というか確実にPreparationListenNetWork()が間違っていると思います。
引数無しなのに10800書いてますし・・・・
ポート番号をどこに書けばいいか分かっていないのです。m(_ _)m
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char StrBuf[ 256 ] ; // データバッファ
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
int DataLength ; // 受信データ量保存用変数
ChangeWindowMode(TRUE); //TRUE:ウインドモード・FALSE:フルスクリーンモード(デフォルト)
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip.d1 = ;//ここに
Ip.d2 = ;//相手の
Ip.d3 = ;//IPアドレスを
Ip.d4 = ;//入れてます
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
PreparationListenNetWork(10800 ) ;
// 確立が成功した場合のみ中の処理をする
if( NetHandle != -1 )
{
// データ送信
NetWorkSend( NetHandle , "繋がったか~!?" , 17 ) ;
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// キー入力待ち
WaitKey() ;
// 接続を断つ
CloseNetWork( NetHandle ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
多分・・・というか確実にPreparationListenNetWork()が間違っていると思います。
引数無しなのに10800書いてますし・・・・
ポート番号をどこに書けばいいか分かっていないのです。m(_ _)m
Re:他マシン接続
>>このプログラムを友人に渡して、友人宅から起動してもらい、私はDXライブラリにあった (No:54430)
では、初めから深黒さんが受信側です。
どちら側で試したいかは
深黒さんと、ご友人との間の、考え方次第だと思います。
>>友人はポート開放してないと思いますね・・・
最初から、深黒さんが受信側ですので
この場合は、深黒さん側でポートを開放しないとできない可能性が有ります。
---編集・追記---
>> うーん、ポート開放は東方非想天則で出来ているつもりだったのですが・・・
そのゲーム?の、ポート解放ができた手順について
こちらで、ご解説されれば、本題の
>> int ConnectNetWork() ;って使用するIPアドレスはグローバルアドレスですか?
が、解決できるかもしれません。
ぜひ、がんばって下さい! (。・_・。)ノ

では、初めから深黒さんが受信側です。
どちら側で試したいかは
深黒さんと、ご友人との間の、考え方次第だと思います。
>>友人はポート開放してないと思いますね・・・
最初から、深黒さんが受信側ですので
この場合は、深黒さん側でポートを開放しないとできない可能性が有ります。
---編集・追記---
>> うーん、ポート開放は東方非想天則で出来ているつもりだったのですが・・・
そのゲーム?の、ポート解放ができた手順について
こちらで、ご解説されれば、本題の
>> int ConnectNetWork() ;って使用するIPアドレスはグローバルアドレスですか?
が、解決できるかもしれません。
ぜひ、がんばって下さい! (。・_・。)ノ

Re:他マシン接続
>さっき、自宅パソコン2台で、グローバルアドレスとプライベートアドレスの両方をで通信できるか試した所、グローバルアドレスのほうが失敗しました。
>これは実はポート開放が出来ていなかったということでしょうか・・・・?
自分自身のグローバルIPにはルーティングの都合上接続出来ません。
外から接続出来ないのは別の問題だと思います。
前にも書きましたが、今後のことも考えてwiresharkでパケットを調べることをお勧めします。ネット対戦系を作る場合は、パケット問題は避けて通れないと思います。
http://homepage2.nifty.com/protocol/wireshark/
>これは実はポート開放が出来ていなかったということでしょうか・・・・?
自分自身のグローバルIPにはルーティングの都合上接続出来ません。
外から接続出来ないのは別の問題だと思います。
前にも書きましたが、今後のことも考えてwiresharkでパケットを調べることをお勧めします。ネット対戦系を作る場合は、パケット問題は避けて通れないと思います。
http://homepage2.nifty.com/protocol/wireshark/