HOST 名と IP アドレスを通知するブロードキャスト

  送信側



↓ダウンロード( ポート 11000 )
http://lightbox.on.coocan.jp/download/BROADCAST_SEND.exe

単純に 1秒毎に、ブロードキャストするたけです( Windows タイマーを使用 )
送るのは HOST 名のみ。

↓255.255.255.255 に関しては、MSDN でこう書かれています
>hostname パラメータおよび port パラメータで指定された値にデータグラムを送信し、
>正常に送信されたバイト数を返します。
>hostname パラメータ値に "255.255.255.255" を指定すると、
>既定のブロードキャスト アドレスにデータグラムを送信できます

  
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1

	Private broadcast As UdpClient = Nothing
	Private senddata As Byte() = Nothing

	' ************************************************************
	' 初期処理
	' ************************************************************
	Private Sub Form1_Load(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles MyBase.Load

		' UDP クライアント作成
		broadcast = New UdpClient(11000)
		' ホスト名取得
		Me.TextBox2.Text = Dns.GetHostName()
		' 送信する為に、バイト配列に変換
		senddata = Encoding.ASCII.GetBytes(Me.TextBox2.Text)

		' タイマー処理開始
		Me.Timer1.Enabled = True

	End Sub

	' ************************************************************
	' タイマー処理
	' ************************************************************
	Private Sub Timer1_Tick(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles Timer1.Tick

		Me.Timer1.Enabled = False

		Me.TextBox1.Text = Now

		' 送信
		broadcast.Send(senddata, senddata.Length, "255.255.255.255", 11001)

		Me.Timer1.Enabled = True

	End Sub

	' ************************************************************
	' 終了処理
	' ************************************************************
	Private Sub Form1_FormClosed(ByVal sender As System.Object, _
	ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed

		Me.Timer1.Enabled = False

	End Sub
End Class
  



  受信側



↓ダウンロード( ポート 11001 )
http://lightbox.on.coocan.jp/download/BROADCAST_RECEIVE.exe

受信では、非同期受信でも可能ですが、解りやすいループ処理にする為に、スレッドを使用しています。
受信処理に、タイムアウトが無い( デフォルト ) と、スレッド内でループが発生せず、終了処理ができ無い
ので、タイムアウトを設定しています。( Client プロパティは、Socket クラス です )

※ スレッド内から、Form に直接アクセスできないので、SetData をブリッジとして使用しています。

  
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading

Public Class Form1

	' スレッドの終了をコントロールするフラグ
	Private stopFlg As Integer = 0
	Private UdpClient As New UdpClient(11001)

	' ************************************************************
	' 初期処理
	' ************************************************************
	Private Sub Form1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		' 受信タイムアウト( 送信サイクルの倍 )
		UdpClient.Client.ReceiveTimeout = 2000

		' スレッド処理するメソッドを作成
		Dim ThreadProc As New Thread(AddressOf ThreadEntry)
		' スレッド開始
		ThreadProc.Start()

	End Sub

	' ************************************************************
	' スレッドの入り口
	' ************************************************************
	Private Sub ThreadEntry()

		Dim Bridge As New ProcBridge(AddressOf SetData)

		' 参照する為に、常に 0 で比較後等しければ 0 をセット。1 の時にループ終了
		Do While Interlocked.CompareExchange(stopFlg, 0, 0) = 0

			Thread.Sleep(1000)

			Console.WriteLine(Now)

			Me.Invoke(Bridge, New Object() {1, Now.ToString()})

			Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 11000)
			Try

				' このへんは、MSDN そのまま
				Dim receiveBytes As Byte() = UdpClient.Receive(RemoteIpEndPoint)
				Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)

				Console.WriteLine(returnData.ToString())
				Console.WriteLine(("address:" + RemoteIpEndPoint.Address.ToString() + _
				"、port:" + RemoteIpEndPoint.Port.ToString()))

				Me.Invoke(Bridge, New Object() {2, returnData.ToString() + "/" + _
				RemoteIpEndPoint.Address.ToString()})

			Catch e As Exception
				Console.WriteLine(e.ToString())
			End Try

		Loop

		' 実際の終了を通知する
		Me.Invoke(Bridge, New Object() {-1, "終了処理中です..."})

	End Sub

	' ************************************************************
	' 橋渡し用デリゲート
	' ************************************************************
	Delegate Sub ProcBridge(ByVal type As Integer, ByVal str As String)

	' ************************************************************
	' 橋渡し用実体
	' ************************************************************
	Private Sub SetData(ByVal type As Integer, ByVal str As String)

		If type = 1 Then
			Me.TextBox1.Text = str
		End If
		If type = 2 Then
			Me.TextBox2.Text = str
		End If
		If type = -1 Then
			Me.TextBox2.Text = str
			' 強制描画
			Me.TextBox2.Update()
			Thread.Sleep(1000)
			' 終了通知うけて、実際終了する
			' ( FormClosing と FormClosed が発生する )
			Application.Exit()
		End If

	End Sub


	' ************************************************************
	' フォームが閉じる前( e.Cancel = True でキャンセル可能 )
	' ************************************************************
	Private Sub Form1_FormClosing(ByVal sender As System.Object, _
	ByVal e As System.Windows.Forms.FormClosingEventArgs) _
	Handles MyBase.FormClosing

		' スレッド実行中ならば、スレッドが終了する状態にして、終了処理をキャンセル
		If Interlocked.CompareExchange(stopFlg, 0, 0) = 0 Then
			Interlocked.Exchange(stopFlg, 1)
			e.Cancel = True
		End If

	End Sub

End Class
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ