Chapter 1
Chapter 2
TCP
服务器被动打开(passive open):socket
、bind
、listen
。客户端通过socket
、connect
主动打开(active open)。accept
和connect
是阻塞的
UDP
- UDP可以是全双工的
Chapter 3
字节排序函数
低序字节存储在起始地址:小端(little-endian)字节序;高序字节存储在起始地址:大端(big-endian)字节序。网际协议使用大端字节序来传送这些多字节整数。
字节操纵函数
#include<string.h>
// 把目标字节串指定数目的字节置为c
void *memset(void *dest, int c, size_t len);
// 将指定数目的字节从原字节移到目标字符串
void *memcpy(void *dest, const void *src, size_t nbytes);
// 比较字节串,相同返回0
int memcpy(const void *ptrl, const void *ptr2, size_t nbytes);
readn
、writen
、readline
函数
字节流套接字调用read
或者write
输入或者输出的字节数可能比请求的数量少,然而这不是出错的状态,这是因为内核中用于套接字的缓冲区肯能已经达到了极限。
基于文本行的网络协议:SMTP、HTTP、FTP等
Chapter 4
fork
和exec
函数
#include<unistd.h>
//子进程返回0,父进程返回子进程ID
pid_t fork(void);
//exec把当前进程映像替换成新的程序文件,进程ID不变
6个exec函数不同:
并发服务器轮廓
为什么父进程对connfd
调用close
没有终止它与客户的链接呢?因为每个文件或套接字都有一个引用计数:
大多数TCP服务器是并发的,它们为每个待处理的客户链接调用fork
派生一个子进程。大多数UDP服务器却是迭代的。