特定のNICに関する詳細情報を検索しようとしていますか? 1つのインターフェイスからトラフィックを分離しようとする場合は、まずそれがどれであるかを調べます。あなたはDNSパケットを見て持ってしようとしているURLを盗聴しようとしている場合、また
var nics = from NetworkInterface a
in NetworkInterface.GetAllNetworkInterfaces()
where a.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
a.Supports(NetworkInterfaceComponent.IPv4)
select a;
if (nics.Any())
{
var nic = nics.First();
adapter = new NetworkAdapter();
adapter.Name = nic.Name;
adapter.Description = nic.Description;
adapter.Id = nic.Id;
var props = nic.GetIPProperties();
var ipAddresses = from UnicastIPAddressInformation info
in props.UnicastAddresses
where info.PrefixOrigin == PrefixOrigin.Manual
select info;
adapter.GatewayAddressList = nic.GetIPProperties().GatewayAddresses;
adapter.Available = (nic.OperationalStatus == OperationalStatus.Up);
}
:以下のコードを使用すると、利用可能なインタフェースを列挙するのに役立ちます。 DNSは、URLをIPに変換するのに役立ちます。 DNSをチェックしてください。 DNS検索は、接続の前に行われます。
編集:ここで私は、アダプターIDを列挙するために使用するユーティリティメソッドは次のとおりです。
DLL int GetAvailableAdapters()
{
pcap_if_t *alldevs;
pcap_if_t *devs;
char msgBuffer[LOG_SIZE];
int index = 0;
char* fullname;
int namePtr;
char* shortname;
struct in_addr ip;
// Retrieve the device list on the local machine
if (-1 == pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, msgBuffer))
{
//error
return 0;
}
// Cycle List, and make sure adapters are available/visable
for(devs = alldevs; devs != NULL; devs = devs->next)
{
++index;
//
// Print adapter description
//
sprintf(msgBuffer, " [%d]: %s", index, devs->description);
gblLog(INFO, msgBuffer);
//
// Parse and Print adapters network info in dot-decimal notation
//
/*ip = ((struct sockaddr_in *)(devs->addresses->addr))->sin_addr;
sprintf(msgBuffer, " IPAddr: %s ", inet_ntoa(ip));
gblLog(INFO, msgBuffer);
*/
//
// Print the Registry Key Value from the substring of adapter name
//
fullname = devs->name;
namePtr = strlen(fullname);
shortname = fullname + namePtr;
while(0 < namePtr && fullname[--namePtr] != '_');
if(fullname[namePtr] == '_')
{
// Key is the string after "_" char, get the substring starting at that index.
shortname = fullname + namePtr + 1;
fullname[namePtr] = '\0';
sprintf(msgBuffer, " KeyVal: %s\n", shortname);
gblLog(INFO, msgBuffer);
}
else
{
// Print full name if the "_" char was not found (odd formating...)
sprintf(msgBuffer, " KeyVal: %s\n", fullname);
gblLog(INFO, msgBuffer);
}
}
if(index == 0)
{
gblLog(INFO, "FindAllDevs() returned null devices. No network adapters found!");
}
return index; // Total num of adapters enum
}
この方法を使用するには、のNetworkInterfaceと一緒に、あなたはそのREGを経由して、インデックスとアダプターを関連付けることができるはずですキー。適切なアダプタが見つかったら、そのインデックスを使用してpcapデバイスを開きます。
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
return -1; // error
}
// Cycle the devs until we reach the appropriate index
for(d = alldevs, i = 0; (i < (index- 1)); d = d->next, i++);
// Open the device
if ((adhandle= pcap_open(d->name, // HW name of the network device.
65536, // Portion of the packet to capture. 65536 max packet
adapterFlags, // See adapterFlags above
1000, // 1sec timeout on idle. (We check for exit at this interval)
NULL, // No authentication,
errbuf // Error buffer
)) == NULL)
{
//error opening
pcap_freealldevs(alldevs); // Free the device list
return -1;
}
NetworkAdapterの参考資料はありますか? –
@ m.qayyum通常、アダプタのレジストリキーです。私はまた、アダプタの "与えられた"名前を信じています...上記のコードで各NICのNetworkAdapterクラスの情報をすべて印刷すると、探しているアダプタに接続する情報が見つかりますつかいます。あなたのために存在するかもしれない多くのネットワーク構成のために私が与えることができるまっすぐな参照はありません。がんばろう!より多くの助けが必要な場合は、より専門的な回答を得るために一般的なネットワーク情報を教えてください。 –
@ m.qayyum編集された回答を参照してください。うまくいけば正しい方向に向けることができるいくつかのユーティリティメソッドを提供しました...コード内にすべてのかわいいプリントが必要なのではなく、可視性のためにそこにあります。 –