2 ' Copyright (c) 2010 Apple Inc. All rights reserved.
4 ' Licensed under the Apache License, Version 2.0 (the "License");
5 ' you may not use this file except in compliance with the License.
6 ' You may obtain a copy of the License at
8 ' http://www.apache.org/licenses/LICENSE-2.0
10 ' Unless required by applicable law or agreed to in writing, software
11 ' distributed under the License is distributed on an "AS IS" BASIS,
12 ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ' See the License for the specific language governing permissions and
14 ' limitations under the License.
18 Imports System.Net.Sockets
22 Public Class SimpleChat
23 Public WithEvents MyEventManager As New Bonjour.DNSSDEventManager
24 Private m_service As New Bonjour.DNSSDService
25 Private m_registrar As Bonjour.DNSSDService
26 Private m_browser As Bonjour.DNSSDService
27 Private m_resolver As Bonjour.DNSSDService
28 Private m_socket As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
29 Private m_port As Integer
30 Private m_buffer(1024 * 32) As Byte
31 Private m_async As IAsyncResult
32 Public Delegate Sub SocketDelegate(ByVal msg As String)
33 Private m_socketDelegate As SocketDelegate
34 Private m_name As String
39 'This call is required by the Windows Form Designer.
42 Button1.Enabled = False
44 m_socketDelegate = New SocketDelegate(AddressOf MessageReceived)
46 Dim endPoint As New IPEndPoint(IPAddress.Any, 0)
47 m_socket.Bind(endPoint)
48 endPoint = m_socket.LocalEndPoint
49 m_port = endPoint.Port
51 Dim txtRecord As Bonjour.TXTRecord
52 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
53 m_registrar = m_service.Register(0, 0, Environment.UserName, "_p2pchat._udp", vbNullString, vbNullString, m_port, txtRecord, MyEventManager)
55 Public Sub MyEventManager_ServiceRegistered(ByVal registrar As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal name As String, ByVal regType As String, ByVal domain As String) Handles MyEventManager.ServiceRegistered
57 m_browser = m_service.Browse(0, 0, regType, vbNullString, MyEventManager)
59 Public Sub MyEventManager_ServiceFound(ByVal browser As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal serviceName As String, ByVal regtype As String, ByVal domain As String) Handles MyEventManager.ServiceFound
60 If (serviceName <> m_name) Then
61 Dim peer As PeerData = New PeerData
62 peer.InterfaceIndex = ifIndex
63 peer.Name = serviceName
66 ComboBox1.Items.Add(peer)
67 ComboBox1.SelectedIndex = 0
70 Public Sub MyEventManager_ServiceLost(ByVal browser As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal serviceName As String, ByVal regtype As String, ByVal domain As String) Handles MyEventManager.ServiceLost
71 ComboBox1.Items.Remove(serviceName)
73 Public Sub MyEventManager_ServiceResolved(ByVal resolver As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal fullname As String, ByVal hostname As String, ByVal port As UShort, ByVal record As Bonjour.TXTRecord) Handles MyEventManager.ServiceResolved
75 Dim peer As PeerData = ComboBox1.SelectedItem
77 m_resolver = m_service.QueryRecord(0, ifIndex, hostname, Bonjour.DNSSDRRType.kDNSSDType_A, Bonjour.DNSSDRRClass.kDNSSDClass_IN, MyEventManager)
79 Public Sub MyEventManager_QueryAnswered(ByVal resolver As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal fullName As String, ByVal rrtype As Bonjour.DNSSDRRType, ByVal rrclass As Bonjour.DNSSDRRClass, ByVal rdata As Object, ByVal ttl As UInteger) Handles MyEventManager.QueryRecordAnswered
81 Dim peer As PeerData = ComboBox1.SelectedItem
82 Dim bits As UInteger = BitConverter.ToUInt32(rdata, 0)
83 Dim address As IPAddress = New System.Net.IPAddress(bits)
84 peer.Address = address
86 Public Sub MyEventManager_OperationFailed(ByVal registrar As Bonjour.DNSSDService, ByVal errorCode As Bonjour.DNSSDError) Handles MyEventManager.OperationFailed
87 MessageBox.Show("Operation failed error code: " + errorCode)
90 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
91 Dim peer As PeerData = ComboBox1.SelectedItem
92 Dim message As String = m_name + ": " + TextBox2.Text
93 Dim bytes As Byte() = Encoding.UTF8.GetBytes(message)
94 Dim endPoint As IPEndPoint = New IPEndPoint(peer.Address, peer.Port)
95 m_socket.SendTo(bytes, 0, bytes.Length, 0, endPoint)
96 TextBox1.AppendText(TextBox2.Text + Environment.NewLine)
100 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
101 Dim peer As PeerData = ComboBox1.SelectedItem
102 m_resolver = m_service.Resolve(0, peer.InterfaceIndex, peer.Name, peer.Type, peer.Domain, MyEventManager)
104 Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
105 Dim peer As PeerData = ComboBox1.SelectedItem
106 If ((peer.Address IsNot Nothing) And TextBox2.Text.Length > 0) Then
107 Button1.Enabled = True
109 Button1.Enabled = False
112 Public Sub MessageReceived(ByVal msg As System.String)
113 TextBox1.AppendText(msg)
115 Private Sub OnReceive(ByVal ar As IAsyncResult)
116 Dim bytesReceived As Integer = m_socket.EndReceive(ar)
117 If (bytesReceived > 0) Then
118 Dim msg As String = Encoding.UTF8.GetString(m_buffer, 0, bytesReceived)
119 Me.Invoke(m_socketDelegate, msg)
121 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
125 Public Class PeerData
126 Public InterfaceIndex As UInteger
127 Public Name As String
128 Public Type As String
129 Public Domain As String
130 Public Address As IPAddress
131 Public Port As UShort
133 Overrides Function ToString() As String