linux网络编程五:gethostbyname, getservbyname
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。1. 根据主机名称获取主机的完整信息#includestruct hostent *gethostbyname(const char *name);name参数为主机名返回的是hostent结构体的指针:#includestruct hostent{ch
·
最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。
1. 根据主机名称获取主机的完整信息
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
name参数为主机名
返回的是hostent结构体的指针:
#include <netdb.h>
struct hostent
{
char* h_name; //主机名
char** h_aliases; //主机别名列表
int h_a_addrtype; //地址类型(地址族)
int h_length; //地址长度
char** h_addr_list //按网络字节序列的主机IP地址列表
}
2. 根据名称获取某个服务的完整信息
#include <netdb.h>
struct servent *getservbyname(const char *name, const char *proto);
name参数指定目标服务的名字。
proto参数指定服务类型,传递“tcp” 或 “udp”,传递NULL表示获取所有类型服务。
返回servent结构体的指针:
#include <netdb.h>
struct servent
{
char* s_name; //服务名称
char** s_aliases; //服务的别名列表
int s_port; //端口
char* s_proto; //服务类型,tcp或udp
}
3. 代码
//访问daytime
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <netdb.h>
int main(int argc, char **argv)
{
if (argc != 2) {
fprintf(stderr, "Usage: %s hostname\n", basename(argv[0]));
return 1;
}
char *host = argv[1];
//获取目标主机地址信息
struct hostent *hostinfo = gethostbyname(host);
assert(hostinfo);
//获取daytime服务信息
struct servent *servinfo = getservbyname("daytime","tcp");
assert(servinfo);
printf( "daytime port is %d\n", ntohs( servinfo->s_port ) );
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = servinfo->s_port;
//因为h_addr_list本身就是网络字节序的地址列表,故直接赋值
address.sin_addr = *(struct in_addr*)*hostinfo->h_addr_list;
int sockfd = socket(PF_INET, SOCK_STREAM, 0);
int result = connect(sockfd, (struct sockaddr*)&address, sizeof(address));
assert(result != -1);
char buffer[128];
result = read(sockfd, buffer, sizeof(buffer));
assert(result > 0);
buffer[result] = '\0';
fprintf(stderr, "the day time is:%s\n", buffer);
close(sockfd);
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)