使用C++\C语言编写一个控制台应用序,查询并显示本机运行的所有因特网协议的名称及相应的协议号
时间: 2024-10-13 20:11:43 浏览: 35
silc-client-1.1.8.tar.gz_IP电话/视频会议_Visual_C++_
5星 · 资源好评率100%
在C++中,你可以使用Windows API函数来获取本地计算机上所有网络适配器的IP信息,包括协议名称和协议号。然而,这需要对底层系统API有深入理解,并且通常涉及到结构体如`IP_ADAPTER_ADDRESSES`、`IP_ADAPTER_UNICAST_ADDRESS`等。以下是一个简单的示例,展示了如何获取IPv4和IPv6的信息:
```cpp
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "IPHLPAPI.lib") // 引入所需库
void getProtocolAddresses() {
DWORD result = 0;
PIP_ADAPTER_ADDRESSES addrList = nullptr;
ULONG length = 0;
// 获取地址列表长度
if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, NULL, &addrList, &length) != ERROR_SUCCESS) {
printf("Failed to get adapter addresses.\n");
return;
}
addrList = (PIP_ADAPTER_ADDRESSES)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, length);
// 重新获取长度以分配足够的内存
if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, NULL, &addrList, &length) != ERROR_SUCCESS) {
HeapFree(GetProcessHeap(), 0, addrList);
printf("Failed to allocate memory for addresses.\n");
return;
}
// 遍历地址列表
while (addrList) {
if (addrList->OperStatus == IfOperStatusUp) { // 只显示已启用的接口
char protocolName[50];
switch (addrList->IfType) {
case IF_TYPE_IPv4: strcpy_s(protocolName, sizeof(protocolName), "IPv4"); break;
case IF_TYPE_IPv6: strcpy_s(protocolName, sizeof(protocolName), "IPv6"); break;
// 添加更多其他类型的处理...
}
// 输出协议名和协议号
printf("Protocol: %s, Protocol Number: %d\n", protocolName, addrList->IfIndex);
// 进一步遍历UnicastAddress
for (PIP_ADAPTER_UNICAST_ADDRESS uniAddr = addrList->FirstUnicastAddress; uniAddr != nullptr; uniAddr = uniAddr->NextUnicastAddress) {
printf("\t- IP Address: %s\n", uniAddr->Address.lpSockaddr);
}
// 移动到下一个地址
addrList = addrList->Next;
} else {
addrList = addrList->Next;
}
}
HeapFree(GetProcessHeap(), 0, addrList); // 释放内存
}
int main() {
getProtocolAddresses();
return 0;
}
```
这个程序会显示每个活动网络接口的IPv4和IPv6地址。注意,实际项目中你需要处理错误情况和异常,这里仅作演示。
阅读全文