- now handling multiple addresses on servers

- bonjour service may now be used according mDNSReader/Program.cs
- ignored all bins and objs
master
neonp_cp 2014-07-12 07:08:42 -07:00
parent 81e897b00c
commit 158c2c14c5
25 changed files with 214 additions and 141 deletions

View File

@ -1,6 +1,8 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30501.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Network", "Network", "{94021DC9-3285-44A8-B830-64489127EE2D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Network.ZeroConf", "SD\Network.ZeroConf.csproj", "{2B2D41E0-DBC7-4075-873C-394D02448281}"
@ -51,72 +53,72 @@ Global
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs09
SccLocalPath0 = .
SccProjectUniqueName1 = Network.Tests\\Network.Tests.csproj
SccProjectTopLevelParentUniqueName1 = Bonjour.NET.sln
SccProjectName1 = Network.Tests
SccLocalPath1 = Network.Tests
SccProjectUniqueName2 = Network.Rest\\Network.Rest.csproj
SccProjectTopLevelParentUniqueName2 = Bonjour.NET.sln
SccProjectName2 = Network.Rest
SccLocalPath2 = Network.Rest
SccProjectUniqueName3 = Network\\Network.csproj
SccProjectTopLevelParentUniqueName3 = Bonjour.NET.sln
SccProjectName3 = Network
SccLocalPath3 = Network
SccProjectUniqueName4 = Network.Bonjour.Services\\Network.Bonjour.Services.csproj
SccProjectName4 = Network.Bonjour.Services
SccLocalPath4 = Network.Bonjour.Services
SccProjectUniqueName5 = Network.Rest.MEF\\Network.Rest.MEF.csproj
SccProjectName5 = Network.Rest.MEF
SccLocalPath5 = Network.Rest.MEF
SccProjectUniqueName6 = MEF.Bonjour.Tests\\MEF.Bonjour.Tests.csproj
SccProjectName6 = MEF.Bonjour.Tests
SccLocalPath6 = MEF.Bonjour.Tests
SccProjectUniqueName7 = MEF.Bonjour\\MEF.Bonjour.csproj
SccProjectName7 = MEF.Bonjour
SccLocalPath7 = MEF.Bonjour
SccProjectUniqueName8 = DLNA\\Network.UPnP.DLNA.csproj
SccProjectName8 = DLNA
SccLocalPath8 = DLNA
SccProjectUniqueName9 = UPnPReader\\UPnPReader.csproj
SccProjectName9 = UPnPReader
SccLocalPath9 = UPnPReader
SccProjectUniqueName10 = UPnP\\Network.UPnP.Services.csproj
SccProjectName10 = UPnP
SccLocalPath10 = UPnP
SccProjectUniqueName11 = DnsResolver\\Network.Dns.csproj
SccProjectName11 = DnsResolver
SccLocalPath11 = DnsResolver
SccProjectUniqueName12 = mDNSReader\\mDNSReader.csproj
SccProjectName12 = mDNSReader
SccLocalPath12 = mDNSReader
SccProjectUniqueName13 = Bonjour.NET\\Network.Bonjour.csproj
SccProjectName13 = Bonjour.NET
SccLocalPath13 = Bonjour.NET
SccProjectUniqueName14 = SD\\Network.ZeroConf.csproj
SccProjectName14 = SD
SccLocalPath14 = SD
SccProjectUniqueName15 = Network.Rtsp\\Network.Rtsp.csproj
SccProjectName15 = Network.Rtsp
SccLocalPath15 = Network.Rtsp
SccProjectUniqueName16 = Network.Bonjour.DACP\\Network.Bonjour.DACP.csproj
SccProjectName16 = Network.Bonjour.DACP
SccLocalPath16 = Network.Bonjour.DACP
SccProjectUniqueName17 = Network.Bonjour.RAOP\\Network.Bonjour.RAOP.csproj
SccProjectName17 = Network.Bonjour.RAOP
SccLocalPath17 = Network.Bonjour.RAOP
SccProjectUniqueName18 = Network.Rtp\\Network.Rtp.csproj
SccProjectName18 = Network.Rtp
SccLocalPath18 = Network.Rtp
SccProjectUniqueName19 = Network.Wol\\Network.Wol.csproj
SccProjectName19 = Network.Wol
SccLocalPath19 = Network.Wol
SccProjectUniqueName20 = Network.Rtmp\\Network.Rtmp.csproj
SccProjectName20 = Network.Rtmp
SccLocalPath20 = Network.Rtmp
SccProjectUniqueName21 = Network.Dhcp\\Network.Dhcp.csproj
SccProjectName21 = Network.Dhcp
SccLocalPath21 = Network.Dhcp
SccProjectUniqueName1 = Network.Dhcp\\Network.Dhcp.csproj
SccProjectName1 = Network.Dhcp
SccLocalPath1 = Network.Dhcp
SccProjectUniqueName2 = Network.Rtmp\\Network.Rtmp.csproj
SccProjectName2 = Network.Rtmp
SccLocalPath2 = Network.Rtmp
SccProjectUniqueName3 = Network.Wol\\Network.Wol.csproj
SccProjectName3 = Network.Wol
SccLocalPath3 = Network.Wol
SccProjectUniqueName4 = Network.Rtp\\Network.Rtp.csproj
SccProjectName4 = Network.Rtp
SccLocalPath4 = Network.Rtp
SccProjectUniqueName5 = Network.Bonjour.RAOP\\Network.Bonjour.RAOP.csproj
SccProjectName5 = Network.Bonjour.RAOP
SccLocalPath5 = Network.Bonjour.RAOP
SccProjectUniqueName6 = Network.Bonjour.DACP\\Network.Bonjour.DACP.csproj
SccProjectName6 = Network.Bonjour.DACP
SccLocalPath6 = Network.Bonjour.DACP
SccProjectUniqueName7 = Network.Rtsp\\Network.Rtsp.csproj
SccProjectName7 = Network.Rtsp
SccLocalPath7 = Network.Rtsp
SccProjectUniqueName8 = Network.Tests\\Network.Tests.csproj
SccProjectTopLevelParentUniqueName8 = Bonjour.NET.sln
SccProjectName8 = Network.Tests
SccLocalPath8 = Network.Tests
SccProjectUniqueName9 = Network.Rest\\Network.Rest.csproj
SccProjectTopLevelParentUniqueName9 = Bonjour.NET.sln
SccProjectName9 = Network.Rest
SccLocalPath9 = Network.Rest
SccProjectUniqueName10 = Network\\Network.csproj
SccProjectTopLevelParentUniqueName10 = Bonjour.NET.sln
SccProjectName10 = Network
SccLocalPath10 = Network
SccProjectUniqueName11 = Network.Bonjour.Services\\Network.Bonjour.Services.csproj
SccProjectName11 = Network.Bonjour.Services
SccLocalPath11 = Network.Bonjour.Services
SccProjectUniqueName12 = Network.Rest.MEF\\Network.Rest.MEF.csproj
SccProjectName12 = Network.Rest.MEF
SccLocalPath12 = Network.Rest.MEF
SccProjectUniqueName13 = MEF.Bonjour.Tests\\MEF.Bonjour.Tests.csproj
SccProjectName13 = MEF.Bonjour.Tests
SccLocalPath13 = MEF.Bonjour.Tests
SccProjectUniqueName14 = MEF.Bonjour\\MEF.Bonjour.csproj
SccProjectName14 = MEF.Bonjour
SccLocalPath14 = MEF.Bonjour
SccProjectUniqueName15 = DLNA\\Network.UPnP.DLNA.csproj
SccProjectName15 = DLNA
SccLocalPath15 = DLNA
SccProjectUniqueName16 = UPnPReader\\UPnPReader.csproj
SccProjectName16 = UPnPReader
SccLocalPath16 = UPnPReader
SccProjectUniqueName17 = UPnP\\Network.UPnP.Services.csproj
SccProjectName17 = UPnP
SccLocalPath17 = UPnP
SccProjectUniqueName18 = DnsResolver\\Network.Dns.csproj
SccProjectName18 = DnsResolver
SccLocalPath18 = DnsResolver
SccProjectUniqueName19 = mDNSReader\\mDNSReader.csproj
SccProjectName19 = mDNSReader
SccLocalPath19 = mDNSReader
SccProjectUniqueName20 = Bonjour.NET\\Network.Bonjour.csproj
SccProjectName20 = Bonjour.NET
SccLocalPath20 = Bonjour.NET
SccProjectUniqueName21 = SD\\Network.ZeroConf.csproj
SccProjectName21 = SD
SccLocalPath21 = SD
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU

View File

@ -36,7 +36,7 @@ namespace Network.Bonjour
#region IServiceResolver Members
public void Resolve(string protocol)
public void Resolve(string protocol, params IPEndPoint[] endpoints)
{
if (!protocol.EndsWith("."))
{
@ -53,7 +53,7 @@ namespace Network.Bonjour
protocols.Add(protocol);
if (client == null)
{
client = new MDnsServer();
client = new MDnsServer(endpoints);
client.AnswerReceived += client_AnswerReceived;
client.Resolve(protocol);
}

View File

@ -24,9 +24,13 @@ namespace Network.Bonjour
}
public MDnsServer(IPEndPoint host)
: base(host)
public MDnsServer(params IPEndPoint[] hosts)
: base(hosts)
{
var localEndPoint = new[] { EndPoint };
if (Hosts == null)
Hosts = new[] { new IPEndPoint(IPAddress.Any, 0) };
Hosts = Hosts.Union(localEndPoint).ToArray();
}

View File

@ -20,8 +20,8 @@ namespace Network.Dns
}
public DnsServer(IPEndPoint host)
: base(host)
public DnsServer(params IPEndPoint[] hosts)
: base(hosts)
{
}

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?><ItemProperties xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Properties><Property><Name>svn:ignore</Name><Value>bin
obj
</Value></Property></Properties></ItemProperties>

View File

@ -10,7 +10,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Network</RootNamespace>
<AssemblyName>Network</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Network.Rest\rest.snk</AssemblyOriginatorKeyFile>
@ -37,6 +37,7 @@
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -5,21 +5,22 @@ using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Collections;
using System.Linq;
namespace Network
{
public abstract class Server : IServiceProvider
{
public Server(IPEndPoint host)
public Server(params IPEndPoint[] hosts)
{
Host = host;
Hosts = hosts;
}
public IPEndPoint Host { get; protected set; }
public IPEndPoint[] Hosts { get; protected set; }
//protected TcpListener tcp;
//protected UdpClient udp;
protected Socket server;
protected Socket[] servers;
public bool IsTcp { get; set; }
public bool IsUdp { get; set; }
public bool IsStarted { get; set; }
@ -31,35 +32,59 @@ namespace Network
{
if (IsStarted)
throw new NotSupportedException("You cannot start the server twice");
if (IsTcp)
server = new Socket(Host.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if (IsUdp)
server = new Socket(Host.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
IDictionary<Socket, IPEndPoint> servers = new Dictionary<Socket, IPEndPoint>();
foreach (var host in Hosts.Where(ep => !IsMulticast(ep.Address)))
{
Socket server = null;
if (IsTcp)
server = new Socket(host.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if (IsUdp)
server = new Socket(host.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
servers.Add(server, host);
}
this.servers = servers.Keys.ToArray();
foreach (var host in Hosts.Where(ep => IsMulticast(ep.Address)))
{
foreach (var kvp in servers.Where(kvp => kvp.Value.AddressFamily == host.AddressFamily))
{
kvp.Key.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
JoinMulticastGroup(kvp.Key, host.Address, 5);
};
}
foreach (var kvp in servers)
kvp.Key.Bind(kvp.Value);
if (!IsMulticast(Host.Address))
{
server.Bind(Host);
}
else
{
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Bind(new IPEndPoint(IPAddress.Any, Host.Port));
JoinMulticastGroup(Host.Address, 5);
}
if (IsTcp)
server.Listen(10);
{
foreach (var server in this.servers)
server.Listen(10);
}
OnStart();
IsStarted = true;
if (IsTcp)
server.BeginAccept(ReceiveRequest, null);
{
foreach (var server in this.servers)
server.BeginAccept(ReceiveRequest, server);
}
if (IsUdp)
{
byte[] buffer = new byte[65536];
EndPoint remote = new IPEndPoint(IPAddress.Any, 0); ;
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, buffer);
foreach (var server in this.servers)
{
UdpAsyncState state = new UdpAsyncState();
state.buffer = new byte[65536];
state.server = server;
EndPoint remote = new IPEndPoint(server.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0); ;
server.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, state);
}
}
}
private class UdpAsyncState
{
public Socket server;
public byte[] buffer;
}
public void StartTcp()
{
IsTcp = true;
@ -74,7 +99,7 @@ namespace Network
Start();
}
private void JoinMulticastGroup(IPAddress multicastAddr, byte timeToLive)
private static void JoinMulticastGroup(Socket server, IPAddress multicastAddr, byte timeToLive)
{
MulticastOption optionValue = new MulticastOption(multicastAddr);
server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, optionValue);
@ -93,10 +118,10 @@ namespace Network
{
if (IsTcp)
{
Socket client = server.EndAccept(result);
Socket client = ((Socket)result.AsyncState).EndAccept(result);
if (IsStarted)
server.BeginAccept(ReceiveRequest, null);
((Socket)result.AsyncState).BeginAccept(ReceiveRequest, null);
Treat(new NetworkStream(client), client.RemoteEndPoint as IPEndPoint);
if (IsStateLess)
@ -108,17 +133,18 @@ namespace Network
if (IsUdp)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
int length = server.EndReceiveFrom(result, ref remote);
EndPoint client = remote;
buffer = result.AsyncState as byte[];
var state = ((UdpAsyncState)result.AsyncState);
int length = state.server.EndReceiveFrom(result, ref remote);
IPEndPoint client = (IPEndPoint)remote;
buffer = state.buffer;
byte[] bytes = new byte[length];
Buffer.BlockCopy(buffer, 0, bytes, 0, length);
if (IsStarted)
{
remote = new IPEndPoint(IPAddress.Any, 0);
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, buffer);
state.server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, result.AsyncState);
}
Treat(new MemoryStream(bytes), client as IPEndPoint);
Treat(new MemoryStream(bytes), client);
}
}
@ -131,13 +157,13 @@ namespace Network
if (IsStarted)
{
if (IsTcp)
server.BeginAccept(ReceiveRequest, null);
((Socket)result.AsyncState).BeginAccept(ReceiveRequest, result.AsyncState);
if (IsUdp)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
if (buffer == null)
buffer = new byte[65536];
server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, buffer);
((UdpAsyncState)result.AsyncState).buffer = buffer = new byte[65536];
((UdpAsyncState)result.AsyncState).server.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, ReceiveRequest, result.AsyncState);
}
}
}
@ -149,7 +175,8 @@ namespace Network
{
if (IsStarted)
{
server.Close();
foreach (var server in servers)
server.Close();
OnStop();
IsStarted = false;
}
@ -210,10 +237,9 @@ namespace Network
where TRequest : IServerRequest<TRequest>, new()
{
internal Server(Socket server, Client client)
: this(0)
: this(((IPEndPoint)server.LocalEndPoint).Address, 0)
{
this.server = server;
Host = server.LocalEndPoint as IPEndPoint;
this.servers = new[] { server };
IsStarted = server.IsBound;
IsTcp = client.IsTcp;
IsUdp = client.IsUdp;
@ -231,8 +257,8 @@ namespace Network
}
public Server(IPEndPoint host)
: base(host)
public Server(params IPEndPoint[] hosts)
: base(hosts)
{
}
@ -272,11 +298,12 @@ namespace Network
public void Send(TResponse response, IPEndPoint client)
{
if (server.IsBound)
MemoryStream stream = new MemoryStream();
Send(response, stream);
foreach (var server in servers)
{
MemoryStream stream = new MemoryStream();
Send(response, stream);
server.SendTo(stream.ToArray(), client);
if (server.IsBound && server.AddressFamily == client.AddressFamily)
server.SendTo(stream.ToArray(), client);
}
}

View File

@ -1,3 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup/></configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Threading;
@ -41,9 +42,9 @@ namespace Network.ZeroConf
public event ObjectEvent<IService> ServiceRemoved;
public void Resolve(string protocol)
public void Resolve(string protocol, params IPEndPoint[] endpoint)
{
resolvers.ForEach(delegate(IServiceResolver resolver) { resolver.Resolve(protocol); });
resolvers.ForEach(delegate(IServiceResolver resolver) { resolver.Resolve(protocol, endpoint); });
}
public IList<IService> Resolve(string protocol, TimeSpan timeout, int minCountServices, int maxCountServices)

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
namespace Network.ZeroConf
@ -11,7 +12,7 @@ namespace Network.ZeroConf
{
event ObjectEvent<IService> ServiceFound;
event ObjectEvent<IService> ServiceRemoved;
void Resolve(string protocol);
void Resolve(string protocol, params IPEndPoint[] endpoint);
IList<IService> Resolve(string protocol, TimeSpan timeout, int minCountServices, int maxCountServices);
}
}

View File

@ -21,12 +21,12 @@ namespace Network.UPnP
public event ObjectEvent<IService> ServiceRemoved;
public void Resolve(string protocol)
public void Resolve(string protocol, params IPEndPoint[] endpoints)
{
protocols.Add(protocol);
if (client == null)
{
client = new SsdpClient(0);
client = new SsdpClient(0, endpoints);
client.ResponseReceived += client_AnswerReceived;
client.StartUdp();
}

View File

@ -19,7 +19,7 @@ namespace Network.UPnP
private IPEndPoint local;
public SsdpClient(ushort port)
public SsdpClient(ushort port, params IPEndPoint[] endpoints)
: base(new NetworkConfig(true, false, true))
{
StartUdp(IPAddress.Any, port);

View File

@ -19,23 +19,23 @@ namespace UPnPReader
{
ServiceResolver resolver = new ServiceResolver();
resolver.ServiceFound += new Network.ZeroConf.ObjectEvent<Network.ZeroConf.IService>(resolver_ServiceFound);
//resolver.Resolve("urn:schemas-upnp-org:service:ContentDirectory:1");
resolver.Resolve("urn:schemas-upnp-org:service:ContentDirectory:1");
//resolver.Resolve("upnp:rootdevice");
//resolver.Resolve("urn:schemas-upnp-org:service:RenderingControl:1");
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.14"), 2869);
Browse browse = new Browse("http://192.168.1.14:2869/upnphost/udhisapi.dll?control=uuid:a6da68b3-3d15-4655-861f-503e63673e7d+urn:upnp-org:serviceId:ContentDirectory", null);
XmlDocument didlDoc = new XmlDocument();
XmlDocument browseResponse = browse.GetResponse().Document;
didlDoc.LoadXml(browseResponse.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0].ChildNodes[0].Value);
XmlNamespaceManager xmlns = new XmlNamespaceManager(didlDoc.NameTable);
xmlns.AddNamespace("didl", "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/");
xmlns.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
xmlns.AddNamespace("upnp", "urn:schemas-upnp-org:metadata-1-0/upnp/");
foreach (XmlNode item in didlDoc.SelectNodes("//didl:container/dc:title/text()", xmlns))
{
Console.WriteLine(item.Value);
}
//IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.13"), 2869);
//Browse browse = new Browse("http://192.168.1.13:2869/upnphost/udhisapi.dll?control=uuid:a6da68b3-3d15-4655-861f-503e63673e7d+urn:upnp-org:serviceId:ContentDirectory", null);
//XmlDocument didlDoc = new XmlDocument();
//XmlDocument browseResponse = browse.GetResponse().Document;
//didlDoc.LoadXml(browseResponse.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0].ChildNodes[0].Value);
//XmlNamespaceManager xmlns = new XmlNamespaceManager(didlDoc.NameTable);
//xmlns.AddNamespace("didl", "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/");
//xmlns.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
//xmlns.AddNamespace("upnp", "urn:schemas-upnp-org:metadata-1-0/upnp/");
//foreach (XmlNode item in didlDoc.SelectNodes("//didl:container/dc:title/text()", xmlns))
//{
// Console.WriteLine(item.Value);
//}
Console.WriteLine("Press enter to exit");
Console.Read();

View File

@ -6,6 +6,7 @@ using System.Net.Sockets;
using System.Net;
using System.Threading;
using Network.Bonjour;
using System.Net.NetworkInformation;
namespace mDNSReader
{
@ -15,7 +16,7 @@ namespace mDNSReader
{
BonjourServiceResolver bsr = new BonjourServiceResolver();
bsr.ServiceFound += new Network.ZeroConf.ObjectEvent<Network.ZeroConf.IService>(bsr_ServiceFound);
bsr.Resolve("_airport._tcp.local");
bsr.Resolve("_airport._tcp.local", NetworkInterface.GetAllNetworkInterfaces().SelectMany(nic => nic.GetIPProperties().UnicastAddresses.Where(ip => ip.IsDnsEligible).Select(ip => ip.Address)).Select(ip => new IPEndPoint(ip, 0)).ToArray());
Console.ReadLine();
bsr.Dispose();
//Service s = new Service();