名字与地址转换
DNS域名服务系统中的条目,RR(resource record), A, 4A, MX, CNAME,FQDN(全限定域名)
解析函数向域名服务器发出请求,得到主机信息。
hostent结构:
gethostbyname
gethostbyaddr
servent结构:
getservbyname
getservbyport
能处理IPV6:
addrinfo结构:
getaddrinfo
getnameinfo
shutdown函数关闭某个套接口的读或者写或者两者。然后从I/O复用中去掉相应文件描述符。
TCP服务器框架
迭代服务器
并发服务器
标准的做法是从accept返回后,子进程需要close listenfd, 最后close connectfd; 而父进程需要close connectfd。
如果调用exec族函数,那么由于内存被替换,而不是拷贝,所以没有办法获得connectfd所使用的对端地址。和套接口相关的信息可以由以下函数获得:
getsockname
getpeername
I/O模型
由内核在内核缓冲区准备好数据,然后由内核缓冲区拷贝数据到应用程序缓冲区。
linux的I/O模型分为:
阻塞I/O
非阻塞I/O
I/O复用
信号驱动I/O
异步I/O
由于前四种都会在第二步的时候阻塞于recvfrom调用,所以称之为同步I/O。异步I/O是由内核负责把数据拷贝到应用程序缓冲区的。
我们主要使用select(pselect)和poll(ppoll)这两个函数来分别实现相应的功能。
这一部分内容比较重点,也比较难。特别是服务器端,不派生子进程,而是通过使用I/O复用来迭代处理多客户的模型。我们将用例子来说明这一部分的内容。
使用select函数:select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO
在要监视的fd_set中对相关的位设置,调用select后如果返回的fd_set仍然包括该位(FD_ISSET),那么就是说该位代表的描述符可用。在每次使用之前都要重设fd_set。
pselect函数和select函数的不同点在于timeout结构和信号掩码。
大多数的操作系统支持的时间粒度是10ms。
只讨论第二点,关于sigset参数。常用的技术是在调用pselect的代码里设置对某一个信号的掩码,然后在调用pselect的参数里消去对这个信号的掩码,那么pselect负责对该信号的处理。
poll函数与select函数类似(除了处理流设备时能提供更多信息)。