知道在具有多个NIC的计算机上通过NAT发出的http请求的内部IP吗?

时间:2011-04-20 07:22:07

标签: windows wcf network-programming

想象一个Windows框,其中:

  • 托管WCF服务
  • 有多个网卡
  • 坐在NAT后面

当用户向服务发出请求(在WCF基础结构之上)时,他使用NAT分配给目标计算机的外部地址。

我必须在WCF服务中编写一些代码,它必须知道机器中的几个NIC中的哪一个用于实际处理网络流量。此代码如何识别NIC不太重要 - 它可能是其MAC地址(最好),也可能是NIC的(内部)IP地址。

我该怎么做?

EDIT1

我会尝试提供问题背景。有两个代理人。两者都公开相同的WCF服务。此外,可以指示其中一个代理开始以下列方式探测网络:

  1. 要求代理A将网络探测到代理B
  2. 代理A与代理B协商UDP端口,以便使用代理B公开的WCF服务进行探测。
  3. 一旦协商结束,代理A就会通过UDP启动一些自定义协议,其中代理B充当服务器 - 即它绑定到前一项中协商的UDP端口。
  4. 绑定到UDP端口需要两个部分 - IP地址和UDP端口,其中IP地址可以是特定IP地址或*(绑定到与计算机关联的所有IP地址)。后一种选择对我们不利 - 我会省略原因。这给我们留下了前一个选项 - 绑定到特定的IP地址。但是,当代理B在NAT之后时,用于与WCF服务通信的IP地址是由NAT分配给代理的外部IP地址。另一方面,绑定需要相应的内部IP地址 - 如何获取它?

2 个答案:

答案 0 :(得分:3)

你可以在WCF操作中检查OperationContext.Current.Channel.LocalAddress(它是一个EndpointAddress)吗?

作为旁注,获取远程地址可以通过以下方式完成:

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

- larsw

答案 1 :(得分:-1)

获取MAC使用 System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();

所有Nics: System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

找出真正的侦听IP地址是什么,你可以编写一个代码,在每个地址上监听你的端口并从代理模拟器中ping它以查看该地址是否有效。

干杯,

吉拉德