网络编程 - CS:APP 第十一章
客户端和服务器都是进程,而不是机器或主机。
IP地址
IP地址结构:由于早期的一些原因,存放IP地址的32位无符号整数被放到了一个结构中
1 | struct in_addr { |
由于不同的设备,使用的字节顺序不同。因此,在网络上进行传输时,会首先把字节转换成网络字节顺序,接受时,会再转换回本地字节顺序。
字节顺序和主机顺序的转换:
1 |
|
点分IP地址与32位IP地址的转换:
1 |
|
附
1
2// 将十六进制字符串转换成十进制数:
使用sscanf(str, "%x", &num)使用32位IP地址时,可以直接使用
in_addr
结构而不是in_addr
结构里的s_addr
套接字
是一组绝大多数操作系统都定义的函数,可以实现网络应用。
套接字地址结构
1 | // 这两个结构体所占字节数相同,可以互相转换 |
socket() 通用
1 |
|
connect() 客户端
1 |
|
bind() 服务器
1 |
|
listen() 服务器
1 |
|
accept() 服务器
1 |
|
建立连接
服务器:
- 调用
socket()
,创建连接结点 - 调用
bind()
成为一个服务器套接字 - 调用
listen()
转换成监听描述符 - 调用
accept()
,阻塞程序,等待客户端连接,返回连接描述符
客户端:
- 调用
socket()
,创建连接结点 - 调用
connect()
, 连接服务器
套接字地址和主机名服务名的转换
首先了解,域名和IP地址是等价的,服务名和端口号是等价的
例如localhost和127.0.0.1是等价的,http和80是等价的
从 字符串主机名服务名信息 到 二进制套接字地址信息
为什么要使用这个函数?
域名和IP地址是多对多的,一个域名可能对应多个IP地址,因此此函数返回的链表很有帮助。
1 |
|
getaddrinfo
使用的结构
1 | struct addrinfo { |
从 二进制套接字地址信息 到 字符串主机名服务名信息
1 |
|
辅助简化函数
1 | int open_clientfd(char *hostname, char *port) { |
1 | int open_listenfd(char *port) |
例子
1 | // echoclient.c |
1 | // echoserver.c |
术语索引
protocol family 协议簇:一组相关联的协议