- now handling multiple addresses on servers
- bonjour service may now be used according mDNSReader/Program.cs - ignored all bins and objsmaster
parent
81e897b00c
commit
158c2c14c5
138
Bonjour.NET.sln
138
Bonjour.NET.sln
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ namespace Network.Dns
|
|||
|
||||
}
|
||||
|
||||
public DnsServer(IPEndPoint host)
|
||||
: base(host)
|
||||
public DnsServer(params IPEndPoint[] hosts)
|
||||
: base(hosts)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup/></configuration>
|
||||
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue