🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 名字与地址转换 gethostbyname根据给定的主机名,获取主机信息。 过时,仅用于IPv4,且线程不安全。 ~~~ #include <stdio.h> #include <netdb.h> #include <arpa/inet.h> extern int h_errno; int main(int argc, char *argv[]) { struct hostent *host; char str[128]; host = gethostbyname(argv[1]); printf("%s\n", host->h_name); while (*(host->h_aliases) != NULL) printf("%s\n", *host->h_aliases++); switch (host->h_addrtype) { case AF_INET: while (*(host->h_addr_list) != NULL) printf("%s\n", inet_ntop(AF_INET, (*host->h_addr_list++), str, sizeof(str))); break; default: printf("unknown address type\n"); break; } return 0; } ~~~ # gethostbyaddr函数。 此函数只能获取域名解析服务器的url和/etc/hosts里登记的IP对应的域名。 ~~~ #include <stdio.h> #include <netdb.h> #include <arpa/inet.h> extern int h_errno; int main(int argc, char *argv[]) { struct hostent *host; char str[128]; struct in_addr addr; inet_pton(AF_INET, argv[1], &addr); host = gethostbyaddr((char *)&addr, 4, AF_INET); printf("%s\n", host->h_name); while (*(host->h_aliases) != NULL) printf("%s\n", *host->h_aliases++); switch (host->h_addrtype) { case AF_INET: while (*(host->h_addr_list) != NULL) printf("%s\n", inet_ntop(AF_INET, (*host->h_addr_list++), str, sizeof(str))); break; default: printf("unknown address type\n"); break; } return 0; } ~~~ # 其他 getservbyname getservbyport 根据服务程序名字或端口号获取信息。使用频率不高。 getaddrinfo getnameinfo freeaddrinfo 可同时处理IPv4和IPv6,线程安全的。 # 套接口和地址关联 getsockname 根据accpet返回的sockfd,得到临时端口号 getpeername 根据accpet返回的sockfd,得到远端链接的端口号,在exec后可以获取客户端信息。