3 Imports System.Net.Sockets
7 Public Class SimpleChat
8 Public WithEvents MyEventManager As New Bonjour.DNSSDEventManager
9 Private m_service As New Bonjour.DNSSDService
10 Private m_registrar As Bonjour.DNSSDService
11 Private m_browser As Bonjour.DNSSDService
12 Private m_resolver As Bonjour.DNSSDService
13 Private m_socket As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
14 Private m_port As Integer
15 Private m_buffer(1024 * 32) As Byte
16 Private m_async As IAsyncResult
17 Public Delegate Sub SocketDelegate(ByVal msg As String)
18 Private m_socketDelegate As SocketDelegate
19 Private m_name As String
24 'This call is required by the Windows Form Designer.
27 Button1.Enabled = False
29 m_socketDelegate = New SocketDelegate(AddressOf MessageReceived)
31 Dim endPoint As New IPEndPoint(IPAddress.Any, 0)
32 m_socket.Bind(endPoint)
33 endPoint = m_socket.LocalEndPoint
34 m_port = endPoint.Port
36 Dim txtRecord As Bonjour.TXTRecord
37 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
38 m_registrar = m_service.Register(0, 0, Environment.UserName, "_p2pchat._udp", vbNullString, vbNullString, m_port, txtRecord, MyEventManager)
40 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
42 m_browser = m_service.Browse(0, 0, regType, vbNullString, MyEventManager)
44 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
45 If (serviceName <> m_name) Then
46 Dim peer As PeerData = New PeerData
47 peer.InterfaceIndex = ifIndex
48 peer.Name = serviceName
51 ComboBox1.Items.Add(peer)
52 ComboBox1.SelectedIndex = 0
55 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
56 ComboBox1.Items.Remove(serviceName)
58 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
60 Dim peer As PeerData = ComboBox1.SelectedItem
62 m_resolver = m_service.QueryRecord(0, ifIndex, hostname, Bonjour.DNSSDRRType.kDNSSDType_A, Bonjour.DNSSDRRClass.kDNSSDClass_IN, MyEventManager)
64 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
66 Dim peer As PeerData = ComboBox1.SelectedItem
67 Dim bits As UInteger = BitConverter.ToUInt32(rdata, 0)
68 Dim address As IPAddress = New System.Net.IPAddress(bits)
69 peer.Address = address
71 Public Sub MyEventManager_OperationFailed(ByVal registrar As Bonjour.DNSSDService, ByVal errorCode As Bonjour.DNSSDError) Handles MyEventManager.OperationFailed
72 MessageBox.Show("Operation failed error code: " + errorCode)
75 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
76 Dim peer As PeerData = ComboBox1.SelectedItem
77 Dim message As String = m_name + ": " + TextBox2.Text
78 Dim bytes As Byte() = Encoding.UTF8.GetBytes(message)
79 Dim endPoint As IPEndPoint = New IPEndPoint(peer.Address, peer.Port)
80 m_socket.SendTo(bytes, 0, bytes.Length, 0, endPoint)
81 TextBox1.AppendText(TextBox2.Text + Environment.NewLine)
85 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
86 Dim peer As PeerData = ComboBox1.SelectedItem
87 m_resolver = m_service.Resolve(0, peer.InterfaceIndex, peer.Name, peer.Type, peer.Domain, MyEventManager)
89 Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
90 Dim peer As PeerData = ComboBox1.SelectedItem
91 If ((peer.Address IsNot Nothing) And TextBox2.Text.Length > 0) Then
92 Button1.Enabled = True
94 Button1.Enabled = False
97 Public Sub MessageReceived(ByVal msg As System.String)
98 TextBox1.AppendText(msg)
100 Private Sub OnReceive(ByVal ar As IAsyncResult)
101 Dim bytesReceived As Integer = m_socket.EndReceive(ar)
102 If (bytesReceived > 0) Then
103 Dim msg As String = Encoding.UTF8.GetString(m_buffer, 0, bytesReceived)
104 Me.Invoke(m_socketDelegate, msg)
106 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
110 Public Class PeerData
111 Public InterfaceIndex As UInteger
112 Public Name As String
113 Public Type As String
114 Public Domain As String
115 Public Address As IPAddress
116 Public Port As UShort
118 Overrides Function ToString() As String