CSAPP:网络编程(一)IP相关

IP地址

IP地址就是一个32位无符号整数。

struct in_addr{
    unsigned int s_addr;
};

IP的网络字节顺序

方法:大端法

unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);

返回:按照网络字节顺序的值。

IP的主机字节顺序

方法: 小端法

unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

返回:按照主机字节顺序的值。
练习1.将16进制的参数转换成点分十进制。
hex2dd.c:

#include <stdio.h>
#include <arpa/inet.h>
int main(int argc,char * argv[])
{
    struct in_addr addr;
    unsigned int ip_h;
    sscanf(argv[1],"0x%x",&ip_h);
    unsigned int ip_n = htonl(ip_h);//按照网络字节顺序的值
    char *ip_s = NULL;
    addr.s_addr = ip_n;
    ip_s = inet_ntoa(addr); //将ip地址转换成点分十进制
    printf("ip_h : %x , ip_n : %x , addr_ip: %s \n",ip_h,ip_n,ip_s);
    return 0;
}

结果:

bigship@bigship-virtual-machine:~/netlearning$ ./hex2dd 0x8002c2f2
ip_h : 8002c2f2 , ip_n : f2c20280 , addr_ip: 128.2.194.242 

练习2.将成点分十进制IP地址转换成十六进制
dd2hex.c:

#include <stdio.h>
#include <arpa/inet.h>

int main(int argc ,char * argv[])
{
    struct in_addr addr;
    unsigned int ip_h;
    if(inet_aton(argv[1],&addr))//将点分十进制ip地址转换unsigned int
        ip_h = ntohl(addr.s_addr);//按照主机字节顺序的值
    else
        printf("error\n");
    printf("ip_h:0x%x\n",ip_h);
    return 0;

}

结果:

bigship@bigship-virtual-machine:~/netlearning$ ./dd2hex 128.2.194.242
ip_h:0x8002c2f2

域名

因特网客户端和服务器相互通信时使用的是IP地址。因为IP地址太过难记因此人们提出了域名,以及将域名映射到IP地址的机制。例如:www.baidu.com
这个映射是通过DNS(Domain Name System,域名系统)来维护的。

/*
 *DNS host entry structure
 */
 struct hostent{
     char *h_name; //主机的官方名称
     char ** h_aliases; //别名
     int h_addrtype; //主机地址的类型
     int h_length //地址的长度(字节)
     char **h_addr_list; //IP地址表

hostinfo.c:

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

int main(int argc,char * argv[])
{
    char **pp;
    struct in_addr addr;
    struct hostent *hostp;
    if(argc!=2){
        fprintf(stderr,"usage %s:error",argv[0]);
        exit(0);
    }
    if(inet_aton(argv[1],&addr)){
        printf("by address\n");
        hostp = gethostbyaddr((const char *)(&addr),sizeof(addr),AF_INET);
        //返回和IP地址相关的主机条目
    }
    else{
        printf("by name\n");
        hostp = gethostbyname(argv[1]);
                //返回和域名相关的主机条目
    }
    printf("Official hostname: %s\n",hostp->h_name);
    for(pp = hostp->h_aliases;*pp;pp++){
        printf("alias: %s\n",*pp);
    }
    for(pp = hostp->h_addr_list;*pp;pp++){
        addr.s_addr=((struct in_addr *)*pp)->s_addr;
        printf("address: %s\n",inet_ntoa(addr));
    }
    return 0;
}

结果:

bigship@bigship-virtual-machine:~/netlearning$ ./hostinfo www.baidu.com
by name
Official hostname: www.a.shifen.com
alias: www.baidu.com
address: 119.75.218.70
address: 119.75.217.109
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值