以前、C言語でTCP/IPのソケット通信の記事「TCP/IPプログラムのいろはは、DOS窓でWinSockAPI」を書きましたので、VisualBasicでも使ってみようかと。だけどその前に、VBにとって重要そうな(私だけ?)エンドポイントについて。
VBでは、ネットワークアドレスとサービスポートの組み合わせを「エンドポイント」と呼びます。
ネットワークアドレスは、ネットワーク上の特定のデバイス(例えば、PCなど)を識別します。ポート番号は、そのデバイス上の特定のサービスの接続先(例えば、メール)を識別します。
TCP/IPは、ネットワークアドレスとサービスポート番号を使用して、一意にサービスを識別し、通信しています。
インターネット検索すると、エンドポイント(EndPoint)の決め方が色々ある様ですので、目に付いたものの内容を確認してみる事に。
<注意点>
・EndPoint確認のネットワーク環境
(1)無し、自PC内動作 ⇒ 外部接続無し、単独動作
(2)LAN、LAN内動作 ⇒ 外部接続無し、DHCPが192.168.x.yを配布
(3)インターネット、外部動作 ⇒ 外部接続有(デュアルスタック)
・どんな相手でも受け入れてしまうAnyアドレス(0.0.0.0)は、利用しない方が宜しいかと。
・エラー処理は手抜きです。
お試し環境
Windows7 64bit Edition
Visual Basic 2008 AnyCPU対象
/*-------------------------------- お試し結果 ------------------------------*/
・(1)ネットワーク接続は無し、自PC内動作
①IPv6、ループバック
②IPv6、ループバック
③IPv6、ループバック
④IPv4、ループバック
⑤IPv4、未指定アドレス
⑥IPv4、ループバック
⑦IPv4、ループバック
⑧IPv4、未指定アドレス
⑨例外発生(そのようなホストは不明です)
・(2)ネットワーク接続はLAN、LAN内動作
①IPv6、リンクローカルアドレス
②IPv6、ループバック
③IPv6、リンクローカルアドレス
④IPv4、ループバック
⑤IPv4、未指定アドレス
⑥IPv4、プライベートアドレス
⑦IPv4、ループバック
⑧IPv4、未指定アドレス
⑨例外発生(そのようなホストは不明です)
・(3)ネットワーク接続はインターネット、外部動作
①IPv6、リンクローカルアドレス
②IPv6、ループバック
③IPv6、リンクローカルアドレス
④IPv4、ループバック
⑤IPv4、未指定アドレス
⑥IPv4、グローバルアドレス
⑦IPv4、ループバック
⑧IPv4、未指定アドレス
⑨IPv4、リモートアドレス
/*----------------------------------------------------------------------------*/
/*-------------------------------- お試しソース ----------------------------*/
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim remoteEndPoint As Net.IPEndPoint
Dim msg As String
Dim port As Integer = 22000
' ① EndPoint check1
Dim ipHostInfo As Net.IPHostEntry = Net.Dns.GetHostEntry(Net.Dns.GetHostName())
Dim ipAddress As Net.IPAddress = ipHostInfo.AddressList(0)
Dim localEndPoint As New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint1")
' ② EndPoint check2
ipHostInfo = Net.Dns.GetHostEntry("localhost")
ipAddress = ipHostInfo.AddressList(0)
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint2")
' ③ EndPoint check3
ipHostInfo = Net.Dns.GetHostEntry("127.0.0.1")
ipAddress = ipHostInfo.AddressList(0)
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint3")
' ④ EndPoint check4
ipAddress = Net.IPAddress.Parse("127.0.0.1")
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint4")
' ⑤ EndPoint check5
localEndPoint = New Net.IPEndPoint(Net.IPAddress.Any, port)
msg = "localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint5")
' ⑥ EndPoint check6
ipHostInfo = Net.Dns.Resolve(Net.Dns.GetHostName())
ipAddress = ipHostInfo.AddressList(0)
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint6")
' ⑦ EndPoint check7
ipHostInfo = Net.Dns.Resolve("localhost")
ipAddress = ipHostInfo.AddressList(0)
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint7")
' ⑧ EndPoint check8
ipAddress = Net.Dns.Resolve(Net.IPAddress.Any.ToString()).AddressList(0)
localEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipAddress : " & ipAddress.ToString & vbCrLf & _
"localEndPoint : " & localEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check local EndPoint8")
' ⑨ EndPoint check9
Try
ipHostInfo = Net.Dns.GetHostEntry("www.nifty.com")
ipAddress = ipHostInfo.AddressList(0)
remoteEndPoint = New Net.IPEndPoint(ipAddress, port)
msg = "ipHostInfo : " & ipHostInfo.ToString & vbCrLf & _
"ipAddress : " & ipAddress.ToString & vbCrLf & _
"remoteEndPoint : " & remoteEndPoint.ToString
MsgBox(msg, MsgBoxStyle.Information, "Check remote EndPoint9")
Catch ex As Net.Sockets.SocketException
Debug.Print("SocketException : {0}", ex.ToString())
Catch ex As Exception
Debug.Print("Unexpected exception : {0}", ex.ToString())
End Try
End Sub
End Class
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*============================================================================*/