struct hostent {
char *h_name; 官方主机名
char **h_aliases; 别名字符串的指针数组
int h_addrtype; IP地址类型
int h_length; IP地址长度
char **h_addr_list; IP地址字符串的指针数组
};
有一个hostent.c的例子,然后我想写一个gethostbyaddr的例子,但是遇到了问题,
描述一下:
#include <stdio.h> #include <unistd.h> #include <netdb.h> #include <arpa/inet.h>
int main(int argc, char *argv[]) { char *ptr, **pptr; char str[INET_ADDRSTRLEN]; struct hostent *hptr; struct sockaddr_in addr;
while (-- argc > 0) { ptr = * ++argv; inet_pton(AF_INET, ptr, &addr.sin_addr); if ((hptr = gethostbyaddr(&addr.sin_addr, sizeof(addr.sin_addr), AF_INET)) == NULL) { /* 在这里总是查不到?为什么呢? 书中说是in_addr结构的指针,传参应该没错的*/ printf("gethostbyaddr() error: %s:%s\n", ptr, hstrerror(h_errno)); continue; } printf("official hostname: %s\n", hptr->h_name); for (pptr = hptr->h_aliases; *pptr != NULL; pptr ++) printf("\talias: %s\n", *pptr);
switch (hptr->h_addrtype) { case AF_INET: pptr = hptr->h_addr_list; for (; *pptr != NULL; pptr ++) printf("\taddress: %s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); break; default: printf("unknown address type\n"); break; } }
return 0; }
为什么每次都是:
gethostbyaddr() error: 119.75.217.109:Unknown host
这个问题我先放下了,继续看后面的:
struct servent {
char *s_name; // 官方服务名称
char **s_aliases; // 别名
int s_port; // 端口号,还是网络字节序的,这个是这个结构里最重要的东西了
char *s_proto; // 服务使用的协议
};
struct servent *getservbyport(int port, const char *protoname);
这个函数中port依然要求是网络字节序的,填写时需要使用htons()来转换。
接下来又有一个例子,是传入主机名和服务名来显示时间的,这个我用www.baidu.com还有www.google.com都是不行,
他们都是不开启这个功能的,我用的是RedHat6.3server系统,所以在root权限下,使用ntsys命令,可以打开开启
各种服务的选项,把daytime-dgram和daytime-stream启用就可以了,直接试自己的IP地址来测试就行了。
int getaddrinfo(
const char *hostname, //主机名和地址串都可以
const char *service, //服务名和十进制端口号串都可以
const struct addrinfo *hints, //可以为NULL,或者控制返回的信息
struct addrinfo **result);//这就是返回的信息,结构链表
struct addrinfo {
int ai_flags; //指定一些限制
int ai_family; // AF_xxx
int ai_socktype; // SOCK_xxx
int ai_protocol; // IPPROTO_xxx
socklen_t ai_addrlen;
char *ai_canonname; //主机的官方名
struct sockaddr *ai_addr;
struct addrinfo *ai_next; //这个链长度和IP地址个数还有服务支持的类型有关
};