2020/2/20 端口绑定和域名解析

自闭症网瘾萝莉.ら 提交于 2020-02-21 04:19:48

端口绑定和域名解析

TCP服务器的同一个端口不能够启动、绑定两次;但UDP服务器可以,但客户端连接上以后,信息只能发送给最新绑定的那个服务器端口,相当于端口被重新绑定了。

 

域名解析函数

struct hostent{
    char *h_name;        //主机名
    char **h_aliases;    //别名
    int h_addrtype;      //协议类型
    int h_length;        //网络地址大小
    char **h_addr_list;  //指向网络地址的指针
};

#include <netdb.h>
struct hostent *gethostent(void);
struct hostent* gethostbyname(const char *hostname);
void sethostent(int stayopen);
void endhostent(void);//有get就有end,用于释放内存

查看/etc/hosts文件可以知道本机的IP和域名


利用gethostbyname解析域名

源代码

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>

void out_addr(struct hostent *h)
{
	printf("hostname: %s\n", h->h_name);
	printf("addrtype: %s\n", h->h_addrtype == AF_INET ? "IPV4":"IPV6");
	char ip[16];
	memset(ip, 0, sizeof(ip));
	inet_ntop(h->h_addrtype, h->h_addr_list[0], ip, sizeof(ip));
	
	int i = 0;
	while(h->h_aliases[i] != NULL){
		printf("aliases: %s\n", h->h_aliases[i]);
		i++;
	}
}

int main(int argc, char *argv[])
{
	if(argc < 2){
		printf("usage: %s host\n", argv[0]);//输入域名,可以是主机名也可以是别名
		exit(1);
	}
 	struct hostent *h;
	
	h = gethostbyname(argv[1]);
	if(h != NULL){
		out_addr(h);
	}	
	else{
		printf("no %s exist\n", argv[1]);
	}
	return 0;
}

利用gethostent解析域名

源代码

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>

void out_addr(struct hostent *h)
{
	printf("hostname: %s\n", h->h_name);
	printf("addrtype: %s\n", h->h_addrtype == AF_INET ? "IPV4":"IPV6");
	char ip[16];
	memset(ip, 0, sizeof(ip));
	inet_ntop(h->h_addrtype, h->h_addr_list[0], ip, sizeof(ip));
	
	int i = 0;
	while(h->h_aliases[i] != NULL){
		printf("aliases: %s\n", h->h_aliases[i]);
		i++;
	}
}

int main(int argc, char *argv[])
{
	if(argc < 2){
		fprintf(stderr, "usage: %s host\n", argv[0]);//fprintf输出到指定位置,stderr就是指屏幕
		exit(1);
	}
 	struct hostent *h;
	while((h = gethostent()) != NULL){//通过遍历,获取每一组
		if(!strcmp(argv[1], h->h_name)){//查看每一组的主机名是否与输入的一致
			out_addr(h);
			exit(0);
		}
		else{
				int i = 0;
				while(h->h_aliases[i] != NULL){//主机名没有,再遍历别名
					if(!strcmp(argv[1], h->h_aliases[i])){
						out_addr(h);
						exit(0);
					}
					i++;
				}
			}
	}
	endhostent();
	printf("no %s exist\n", argv[1]);

	return 0;
}

运行结果


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!