最近在看《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;
}



Logo

更多推荐