動作中のすべての IPV4 ソケットに動的にバインドする例を次に示します。もちろん、バインドしているアドレスとポートを追跡し、GetKnownNodes() 関数を実装しているサービスに報告する必要があります。ループバック アドレスと外部 IP との競合を避けるために、ポートを変更していることに注意してください。もちろん、これは別の方法で処理できます。
using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.ServiceModel;
namespace Stackoverflow11750995
{
[ServiceContract]
public interface ITimeService
{
[OperationContract]
string TimeAsString();
}
public class TimeService : ITimeService
{
public string TimeAsString()
{
return string.Format("The time is {0:f}", DateTime.Now);
}
}
class Program
{
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(Stackoverflow11750995.TimeService)))
{
int port = 12345;
foreach (var adpt in NetworkInterface.GetAllNetworkInterfaces())
{
if (adpt.OperationalStatus == OperationalStatus.Up)
{
foreach (var addr in adpt.GetIPProperties().UnicastAddresses)
{
if (addr.Address.AddressFamily == AddressFamily.InterNetwork)
{
string uri = string.Format("net.tcp://{0}:{1}/Service", addr.Address, port++);
host.AddServiceEndpoint(typeof(ITimeService), new NetTcpBinding(), uri);
}
}
}
}
host.Open();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
}