トップページ > 記事閲覧
使用するIPアドレスの指定
名前:Tir 日時: 2019/02/17 23:03

IPv6で通信しようとするとIPv6アドレスではなく勝手に一時IPv6アドレスを使用します。 一時IPv6が1つならいいのですが複数ある場合自分が使用する一時IPv6アドレスがどれか分かるか もしくは自分が使用するIPアドレスを指定する方法は無いでしょうか?
メンテ

Page: 1 |

Re: 使用するIPアドレスの指定 ( No.1 )
名前:管理人 日時:2019/02/19 02:14

WinSock の API に自分の IPv6 アドレスを取得するための機能があるのですが、これで取得できる IPv6 アドレスが一時IPv6アドレスなのか固定IPv6アドレスなのかを確認してみますので、少々( 1日〜数日 )お待ちください m(_ _)m
メンテ
Re: 使用するIPアドレスの指定 ( No.2 )
名前:管理人 日時:2019/02/20 00:29

自分の IPv6アドレスを取得するための関数 GetMyIPAddress_IPv6 を追加しましたので、 よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) // 自分のIPv6を取得する // IpBuf : 取得した IPv6 の情報を格納する配列の先頭アドレス // IpBufLength : IpBuf に渡す配列の長さ // IpNum : 取得したIPの数を格納する int型変数のアドレス int GetMyIPAddress_IPv6( IPDATA_IPv6 *IpBuf, int IpBufLength, int *IpNum ) ; 取得できるIPアドレスが複数ある場合が殆どなので、IPDATA_IPv6 構造体の配列を渡すようになっています IPDATA_IPv6 IPv6Data[ 16 ] ; int IPv6DataNum ; GetMyIPAddress_IPv6( IPv6Data, 16, &IPv6DataNum ) ; 取得した IPv6アドレスを一覧表示するプログラムは以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { IPDATA_IPv6 IPv6Data[ 16 ] ; int IPv6DataNum ; int i ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // IPv6を取得 GetMyIPAddress_IPv6( IPv6Data, 16, &IPv6DataNum ) ; // 画面に表示 for( i = 0 ; i < IPv6DataNum ; i ++ ) { DrawFormatString( 0, i * 16, GetColor( 255,255,255 ), IPv6Data[ i ].ScopeID != 0 ? "%x:%x:%x:%x:%x:%x:%x:%x%%%d" : "%x:%x:%x:%x:%x:%x:%x:%x", ( IPv6Data[ i ].Byte[ 0 ] << 8 ) | IPv6Data[ i ].Byte[ 1 ], ( IPv6Data[ i ].Byte[ 2 ] << 8 ) | IPv6Data[ i ].Byte[ 3 ], ( IPv6Data[ i ].Byte[ 4 ] << 8 ) | IPv6Data[ i ].Byte[ 5 ], ( IPv6Data[ i ].Byte[ 6 ] << 8 ) | IPv6Data[ i ].Byte[ 7 ], ( IPv6Data[ i ].Byte[ 8 ] << 8 ) | IPv6Data[ i ].Byte[ 9 ], ( IPv6Data[ i ].Byte[ 10 ] << 8 ) | IPv6Data[ i ].Byte[ 11 ], ( IPv6Data[ i ].Byte[ 12 ] << 8 ) | IPv6Data[ i ].Byte[ 13 ], ( IPv6Data[ i ].Byte[ 14 ] << 8 ) | IPv6Data[ i ].Byte[ 15 ], IPv6Data[ i ].ScopeID ) ; } // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 取得できた IPv6アドレスですが、IPDATA_IPv6 構造体のメンバー変数 ScopeID の値が 0 ではないアドレスは リンクローカルIPv6アドレスというもので外部からの接続には使用できないアドレスらしいです( すみません私も詳しくは分かっていません ) ScopeID の値が 0 の最初のアドレスが IPv6アドレスで、ScopeID の値が 0 の 2番目のアドレスが 一時IPv6アドレスのようです
メンテ
Re: 使用するIPアドレスの指定 ( No.3 )
名前:Tir(解決) 日時:2019/02/20 01:24

関数の追加ありがとうございます。 現在ipconfigで確認できる一時IPv6アドレスが3つあるのですが サンプルを試してみた結果1つしか表示されず、無事にそれが通信時に使われているものだと確認が出来ました。 ただ、こちらの環境では表示された順番が リンクローカルIPv6アドレス 一時IPv6アドレス IPv6アドレス という順番でしたので必ずしも順番は固定では無いかもしれません。 ipconfigで取得したIpv6アドレスと比較する事でどちらが一時Ipv6かは判断できるので問題はありませんが
メンテ
Re: 使用するIPアドレスの指定 ( No.4 )
名前:管理人(解決) 日時:2019/02/22 06:39

意図される処理が実現できたようで何よりです ただ、IPv6アドレスは一つだけしか表示されなかったのですか、てっきり必ず一時IPv6と通常のIPv6が 必ず検出されるものだと思っていました… ご情報ありがとうございます m(_ _)m
メンテ
Re: 使用するIPアドレスの指定 ( No.5 )
名前:Tir(解決) 日時:2019/02/22 11:47

管理人さんの意図した動作ではなかったみたいなので参考までに画像を貼ります。(一応固定IPv6アドレスはぼかしてあります) ttps://i.imgur.com/C2yNZdl.jpg 一応僕がやりたかったことは この度IPv6に対応したので、最初は固定IPv6アドレスを入力して通信のテストをしたのですが上手く行かず 外部ツールにて調べたところ通信時に一時IPv6アドレスを使用していて、お互いに一時IPv6アドレスを入力する事で 通信に成功しました。 しかし固定IPv6アドレスと違って一時IPv6アドレスは増えていくので、その中でDXライブラリで通信を行う一時IPv6アドレスが 外部ツールを使用しないと分からない状態でした。 つまり複数ある一時IPv6アドレスの中から通信時に使用される一時IPv6アドレス1つを検出したかったのです。 上記の画像では ipconfigだと検出された一時IPv6アドレスの数は5つでどれを使用すれば分からない状態ですが DXライブラリで検出された一時IPv6アドレスは1つのみで、画像下の外部ツールで検出した送信時に使用されている一時IPv6アドレスと 一致しているので無事に通信時に使用される一時IPv6アドレスを検出する事が出来ました。
メンテ
Re: 使用するIPアドレスの指定 ( No.6 )
名前:管理人(解決) 日時:2019/02/23 23:35

詳しいご説明ありがとうございます 一時IPv6アドレスはどんどん増えていくのですね…勉強になります (・・;
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存