Imports System.Net 'IPHostEntry , IPEndPoint
Imports System.Net.Sockets 'UdpClient , SocketException

'Imports sample3.InternetTime

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。

    End Sub

    ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    ' Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使って変更してください。  
    ' コード エディタを使って変更しないでください。
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.Button2 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(40, 32)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(120, 32)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        '
        'Button2
        '
        Me.Button2.Location = New System.Drawing.Point(40, 80)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(120, 32)
        Me.Button2.TabIndex = 1
        Me.Button2.Text = "Button2"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
        Me.ClientSize = New System.Drawing.Size(192, 150)
        Me.Controls.Add(Me.Button2)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    'リスト 1  基本 (sample1)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Try
            Dim bdata(47) As Byte   '送受信用バイナリ配列


            '設定
            Dim udpc As UdpClient = New UdpClient
            Dim IPhost As IPHostEntry = Dns.Resolve("time.windows.com")
            Dim EPhost As IPEndPoint = New IPEndPoint(IPhost.AddressList(0), 123)

            '接続
            udpc.Connect(EPhost)

            '交信
            bdata(0) = &H1B
            udpc.Send(bdata, bdata.Length)   '送信

            bdata = udpc.Receive(EPhost)     '受信
            If bdata.Length < 48 Then
                Throw New Exception("サーバーが応答しません")
            Else
                Dim dstr As String      '表示用文字列
                Dim a As Integer

                For a = 0 To 47
                    dstr += Convert.ToString(bdata(a), 16).ToUpper + " "
                Next
                MessageBox.Show(dstr)
            End If

            '（切断）解放 ※UDPに切断の概念はないが ポートを解放する必要はある
            udpc.Close()

        Catch ex As SocketException
            Throw New Exception(ex.Message)
        End Try


    End Sub

    'リスト 2  (sample2)

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Try
            Dim bdata(47) As Byte   '送受信用バイナリ配列


            '設定
            Dim udpc As UdpClient = New UdpClient
            Dim IPhost As IPHostEntry = Dns.Resolve("time.windows.com")
            Dim EPhost As IPEndPoint = New IPEndPoint(IPhost.AddressList(0), 123)

            '接続
            udpc.Connect(EPhost)

            '交信
            bdata(0) = &H1B
            udpc.Send(bdata, bdata.Length)   '送信

            bdata = udpc.Receive(EPhost)     '受信
            If bdata.Length < 48 Then
                Throw New Exception("サーバーが応答しません")
            Else
                Dim dstr As String      '表示用文字列
                Dim bary As String      '2進数変換用 中間文字列
                Dim LI As Integer 'LI リープインジケーター
                Dim VN As Integer 'VN バージョンナンバー
                Dim MD As Integer 'Mode モード

                bary = Convert.ToString(bdata(0), 2)          '2進数化
                bary = "00000000" + bary
                bary = bary.Substring(Len(bary) - 8)          'それを8ケタ化

                LI = Convert.ToInt32(bary.Substring(0, 2), 2) '11xxxxxx bit
                VN = Convert.ToInt32(bary.Substring(2, 3), 2) 'xx111xxx bit
                MD = Convert.ToInt32(bary.Substring(5, 3), 2) 'xxxxx111 bit

                dstr = "LI→" + LI.ToString + ControlChars.CrLf
                dstr += "VN→" + VN.ToString + ControlChars.CrLf
                dstr += "Mode→" + MD.ToString + ControlChars.CrLf
                MessageBox.Show(dstr)
            End If

            '（切断）解放 ※UDPに切断の概念はないが ポートを解放する必要はある
            udpc.Close()

        Catch ex As SocketException
            Throw New Exception(ex.Message)
        End Try


    End Sub
End Class
