端口绑定和域名解析
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;
}
运行结果
来源:CSDN
作者:Xinyue_Lu
链接:https://blog.csdn.net/Xinyue_Lu/article/details/104416151