六星经典CSAPP-笔记(11)网络编程

本文是关于《深入理解计算机系统》的网络编程笔记,介绍了网络基础,包括IP地址的表示与转换,以及网络域名概念。详细讲解了Socket接口,如Socket地址、API概览,以及客户端连接和服务端监听的过程。
摘要由CSDN通过智能技术生成

六星经典CSAPP-笔记(11)网络编程

参照《深入理解计算机系统》简单学习了下Unix/Linux的网络编程基础知识,进一步深入学习Linux网络编程和TCP/IP协议还得参考Stevens的书。

1.网络基础

(略过,待补充)

2.IP地址

2.1 IP地址的表示

IP地址是一个无符号的32位整数。Linux网络程序使用下面这种IP地址结构存储IP地址:

/* Internet address structure */
struct in_addr {
    unsigned int s_addr; /* Network byte order (big-endian) */
};

2.2 IP地址转换

因为网络中的主机有可能有不同的字节序,所以TCP/IP协议定义了一种统一的网络字节序 Network Byte Order,即大尾端字节序(基础知识请参考六星经典CSAPP笔记(2)信息的操作和表示)。这样不论主机是大尾端还是小尾端,网络传输时在数据包的header中保存的IP地址都是网络字节序(大尾端)的,实现了程序的可移植性。为了方便这种操作,Unix提供了一些库函数供我们调用。

System Call Function
unsigned long int htonl(unsigned long int hostlong) Convert a 32-bit integer from host byte order to network byte order
unsigned short int htons(unsigned short int hostshort) Convert a 16-bit integer from host byte order to network byte order
unsigned long int ntohl(unsigned long int netlong) Convert a 32-bit integer from network byte order to host byte order
unsigned short int ntohs(unsigned short int netshort) Convert a 16-bit integer from network byte order to host byte order
int inet_aton(const char *cp, struct in_addr *inp) Convert a dotted-decimal string (cp) to an IP address in network byte order (inp)
char *inet_ntoa(struct in_addr in) Convert an IP address in network byte order to its corresponding dotted-decimal string

前四个函数包含在netinet/in.h头文件中,用来在主机字节序和网络字节序间转换。后两个函数包含在arpa/inet.h中,用来在IP地址字符串和in_addr数据结构间转换。下面来看一个小例子:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char const *argv[])
{
    struct in_addr addr;
    char *addr_str;
    uint32_t net_ip;

    addr_str = "192.168.1.100";

    if (inet_aton(addr_str, &addr) == 0) {
        printf("Convert %s to in_addr failed\n", addr_str);
        exit(1);
    }

    // Convert 192.168.1.100 to host byte order 0x6401a8c0
    printf("Convert %s to host byte order 0x%08x\n", addr_str, addr.s_addr);

    // Convert host byte order 0x6401a8c0 to network byte order 0xc0a80164
    net_ip = htonl(addr.s_addr);
    printf("Convert host byte order 0x%08x "
        "to network byte order 0x%08x\n", addr.s_addr, net_ip);
    addr.s_addr = net_ip;

    return 0;
}

apra/inet.c中的ARPA是什么?CSAPP中讲到了Internet的历史,1957年冷战时埋下了互联网的种子,当时苏联发射了第一颗人造地球卫星Sputnik震惊了世界(村上的小说《斯普特尼克恋人》就是指它)。作为回应,美国政府创建了Advanced Research Projects Agency,即ARPA,想要重新建立科技的领导地位。于是1969年一个全新的网络建立起来,叫做ARPANET,也就是互联网的前身。

通过inet_aton函数将字符串192.168.1.100转换成了in_addr数据结构,其s_addr整数值为0x6401a8c0。简单分析一下:
0x64=100,0x01=1,0xA8=168,0xC0=192
说明我的机器是小尾端字节序。之后再使用htonl函数将小尾端字节序的IP地址转为统一的网络字节序。下面是一道课后练习题,编写一个dd2hex.c小工具,将用户输入的IP地址字符串转成网络字节序的16进制整数。

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>

/**
 * Usage:
 *  unix> gcc dd2hex
 *  unix> ./dd2hex 128.2.194.242
 *  0x8002c2f2
 * 
 * @param  argc 2
 * @param  argv 128.2.194.242
 * @return      0x8002c2f2
 */
int main(int argc, char const *argv[])
{
    struct in_addr addr;
    char const *addr_str;
    uint32_t net_ip;

    // 1.Get input arg from cmd line
    if (argc < 1) {
        printf("U
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值