一些读书笔记(4)

来源:互联网 发布:windows关机指令 编辑:程序博客网 时间:2024/05/22 06:35

1. UDP是面向无连接的,那么,我为什么要在它的socket上建立连接呢?UDP调用connect会有三次捂手过程吗?UDP调用sendto后,返回成功,并没有意味着数据发送到对端,而是仅仅表示接口输出队列具有存放sendto导致的数据包的空间,即使不可达对端。不可达到对端的ICMP错误,并不是sendto返回,而是为一个异步错误。为了解决这个问题,解决的办法是,只有在一个已经connect的UDP端口上,这些异常错误才会返回给进程。而这个过程是不存在三次握手的过程。但是事实上,未连接的UDP套接口,和已经连接的UDP套接口在读写接口的调用上也发生了变化。表现如下:

a. 不能通过sendto指定目的IP地址和端口号发送数据,而是改用write或send。或将sendto的目的地址指针设为NULL。

b. 不用recvfrom获得数据包的发送者,改用read、recv或recvmsg。

c. 本点正式所需要的功能,即由已经连接的UDP引发的错误直接返回给进程。


2. 涉及到socket的I/O操作,也会涉及到超时问题,那么书中提到了三种方法设置超时:

a、使用alarm,当设置的alarm超时的时候,产生SIGALRM信号,应用程序对这个信号进行处理。

b、在select中堵塞等待I/O,用来直接堵塞在read或write上。

c、使用SO_RCVTIMEO或SO_SNDTIMEO选项,但并不是所有的系统都支持。


3. 套接口有几个相关的读写函数,对于从套接口接受数据的系统调用有read,readv,recvfrom和recvmsg,库函数有recv,对于向套接口发送数据的系统调用有write,writev,sendto和sendmsg,库函数有send;每个接口都有对应的特点,recv和send特点是,可以通过flags设置一些选项。MSG_DONTROUTE:告诉直连网络无需查找路由表;MSG_DONTWAIT:设置堵塞I/O;MSG_OOB:发送带外数据等。readv和writev表现在单个系统调用读入或写出到一个或多个缓冲区,成为分散读和集中写。