]> git.saurik.com Git - apple/mdnsresponder.git/blob - Clients/SimpleChat.VB/SimpleChat.vb
mDNSResponder-212.1.tar.gz
[apple/mdnsresponder.git] / Clients / SimpleChat.VB / SimpleChat.vb
1
2 Imports System.Net
3 Imports System.Net.Sockets
4 Imports System.Data
5 Imports System.Text
6
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
20
21 Public Sub New()
22 MyBase.New()
23
24 'This call is required by the Windows Form Designer.
25 InitializeComponent()
26
27 Button1.Enabled = False
28
29 m_socketDelegate = New SocketDelegate(AddressOf MessageReceived)
30
31 Dim endPoint As New IPEndPoint(IPAddress.Any, 0)
32 m_socket.Bind(endPoint)
33 endPoint = m_socket.LocalEndPoint
34 m_port = endPoint.Port
35
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)
39 End Sub
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
41 m_name = name
42 m_browser = m_service.Browse(0, 0, regType, vbNullString, MyEventManager)
43 End Sub
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
49 peer.Type = regtype
50 peer.Domain = domain
51 ComboBox1.Items.Add(peer)
52 ComboBox1.SelectedIndex = 0
53 End If
54 End Sub
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)
57 End Sub
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
59 m_resolver.Stop()
60 Dim peer As PeerData = ComboBox1.SelectedItem
61 peer.Port = port
62 m_resolver = m_service.QueryRecord(0, ifIndex, hostname, Bonjour.DNSSDRRType.kDNSSDType_A, Bonjour.DNSSDRRClass.kDNSSDClass_IN, MyEventManager)
63 End Sub
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
65 m_resolver.Stop()
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
70 End Sub
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)
73 End Sub
74
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)
82 TextBox2.Text = ""
83 End Sub
84
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)
88 End Sub
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
93 Else
94 Button1.Enabled = False
95 End If
96 End Sub
97 Public Sub MessageReceived(ByVal msg As System.String)
98 TextBox1.AppendText(msg)
99 End Sub
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)
105 End If
106 m_async = m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, New AsyncCallback(AddressOf OnReceive), Me)
107 End Sub
108 End Class
109
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
117
118 Overrides Function ToString() As String
119 Return Name
120 End Function
121 End Class