写一个代码C++使用gethostname、gethostbyname、getprotobyname、getservbyname等典型的网络信息获取函数取得自己主机的网络信息,如主机名、IP地址、使用的协议、端口号等。
时间: 2024-10-21 08:14:56 浏览: 32
在C++中,你可以使用`gethostname()`,`gethostbyname()`,`getprotobyname()`和`getservbyname()`这些系统库函数来获取主机的网络信息。下面是一个简单的示例,展示如何获取这些信息:
```cpp
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#define MAX_HOST_NAME_LENGTH 256
int main() {
char host_name[MAX_HOST_NAME_LENGTH];
struct hostent *host;
struct sockaddr_in addr;
char service[32];
int port = htons(80); // 默认HTTP服务端口
char protocol[] = "tcp"; // 假设我们查找的是TCP
// 获取主机名
if (gethostname(host_name, MAX_HOST_NAME_LENGTH) != 0) {
perror("Error getting hostname");
return 1;
}
printf("Host Name: %s\n", host_name);
// 解析域名到IP地址
host = gethostbyname(host_name);
if (host == NULL) {
perror("Error resolving hostname");
return 1;
}
// 输出IP地址
printf("IP Address: ");
for (int i = 0; i < host->h_addr_list[0]; ++i) {
inet_ntop(AF_INET, &((struct in_addr *)host->h_addr_list[i])->sin_addr, host_name, sizeof(host_name));
printf("%s ", host_name);
}
printf("\n");
// 使用getprotobyname获取协议
short proto_num = 0;
if ((proto_num = getprotobyname(protocol)) == -1) {
perror("Error getting protocol number");
return 1;
}
printf("Protocol: %s (%d)\n", gai_strerror(proto_num), proto_num);
// 使用getservbyname获取端口号和服务名
struct servent *serv;
if ((serv = getservbyname(service, protocol)) == NULL) {
perror("Error getting service");
return 1;
}
printf("Port: %d - Service: %s\n", ntohs(serv->s_port), serv->s_name);
return 0;
}
```
阅读全文