]> git.saurik.com Git - apple/mdnsresponder.git/blob - Clients/SimpleChat.VB/SimpleChat.vb
mDNSResponder-258.13.tar.gz
[apple/mdnsresponder.git] / Clients / SimpleChat.VB / SimpleChat.vb
1 '
2 ' Copyright (c) 2010 Apple Inc. All rights reserved.
3 '
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
7 '
8 ' http://www.apache.org/licenses/LICENSE-2.0
9 '
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.
15 '
16
17 Imports System.Net
18 Imports System.Net.Sockets
19 Imports System.Data
20 Imports System.Text
21
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
35
36 Public Sub New()
37 MyBase.New()
38
39 'This call is required by the Windows Form Designer.
40 InitializeComponent()
41
42 Button1.Enabled = False
43
44 m_socketDelegate = New SocketDelegate(AddressOf MessageReceived)
45
46 Dim endPoint As New IPEndPoint(IPAddress.Any, 0)
47 m_socket.Bind(endPoint)
48 endPoint = m_socket.LocalEndPoint
49 m_port = endPoint.Port
50
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)
54 End Sub
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
56 m_name = name
57 m_browser = m_service.Browse(0, 0, regType, vbNullString, MyEventManager)
58 End Sub
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
64 peer.Type = regtype
65 peer.Domain = domain
66 ComboBox1.Items.Add(peer)
67 ComboBox1.SelectedIndex = 0
68 End If
69 End Sub
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)
72 End Sub
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
74 m_resolver.Stop()
75 Dim peer As PeerData = ComboBox1.SelectedItem
76 peer.Port = port
77 m_resolver = m_service.QueryRecord(0, ifIndex, hostname, Bonjour.DNSSDRRType.kDNSSDType_A, Bonjour.DNSSDRRClass.kDNSSDClass_IN, MyEventManager)
78 End Sub
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
80 m_resolver.Stop()
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
85 End Sub
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)
88 End Sub
89
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)
97 TextBox2.Text = ""
98 End Sub
99
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)
103 End Sub
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
108 Else
109 Button1.Enabled = False
110 End If
111 End Sub
112 Public Sub MessageReceived(ByVal msg As System.String)
113 TextBox1.AppendText(msg)
114 End Sub
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)
120 End If
121 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
122 End Sub
123 End Class
124
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
132
133 Overrides Function ToString() As String
134 Return Name
135 End Function
136 End Class