windows网络编程使用gethostname、gethostbyname、getprotobyname、getservbyname等典型的网络信息获取函数取得自己主机的网络信息,如主机名、IP地址、使用的协议、端口号代码
时间: 2024-10-18 09:07:06 浏览: 134
Windows网络编程中,可以使用以下几个库函数来获取主机名、IP地址、协议和端口信息:
1. **gethostname**: 这个函数用于获取本地机器的名称,通常返回的是DNS短名称,例如`"localhost"`。例如:
```c++
#include <winsock2.h>
LPSTR hostname;
int size = sizeof(hostname);
WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化Winsock
gethostname(hostname, size);
printf("Host Name: %s\n", hostname);
```
记得在结束程序之前调用`WSACleanup()`关闭Winsock。
2. **gethostbyname**: 用于将域名或IP地址解析成对应的网络结构,如`struct hostent`。例如获取IP地址:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
struct hostent *hp;
char ip[INET_ADDRSTRLEN];
if ((hp = gethostbyname("www.example.com")) == NULL) {
printf("Error resolving domain name.\n");
} else {
inet_ntop(AF_INET, hp->h_addr_list[0], ip, sizeof(ip));
printf("IP Address: %s\n", ip);
}
```
3. **getprotobyname**: 获取协议名称到协议号码的映射,如TCP、UDP等。示例:
```c++
#include <netinet/in.h>
int protocol = 0;
if ((protocol = getprotobyname("TCP")) == -1) {
printf("Failed to find TCP protocol.\n");
}
// 使用protocol
```
4. **getservbyname**: 对应于协议,获取服务名到端口号的映射,如HTTP的80端口。示例:
```c++
#include <arpa/inet.h>
#include <resolv.h>
int port;
struct servent *serv;
if ((serv = getservbyname("http", "tcp")) == NULL) {
printf("Failed to find HTTP service.\n");
} else {
port = ntohs(serv->s_port);
printf("Port for HTTP: %d\n", port);
}
```
别忘了处理错误情况,并在适当的时候加入适当的错误处理机制。在使用这些函数前,务必初始化Winsock库,`WSAGetLastError()`可用于检查错误。
阅读全文