读书笔记之UNIX环境高级编程(16)

来源:互联网 发布:ubuntu trusty xenial 编辑:程序博客网 时间:2024/05/17 04:48
网络IPC:套接字
1.套接字描述符在UNIX系统上是使用文件描述符实现的,许多处理文件描述符的函数都可以处理套接字描述符
2.对于SOCK_STREAM套接字,应用程序意识不到报文界限,因为套接字提供的是字节流服务。这就意味着从套接字读出数据时,它也许不会返回所有由发送进程所写的字节数。最终可以获得发送过来的所有数据,但也许要通过若干次函数调用得到
3.SOCK_SEQPAKET套接字是基于报文的服务而不是字节流服务。从它接受的数据量与对方发送的一致,基于流控制传输协议SCTP
4.套接字描述符本质是文件描述符,大多数使用文件描述符的函数可以处理套接字描述符
5.套接字通信是双向的,shutdown来禁止套接字的输入或输出
6.close只有在最后一个活动引用被关闭时才释放网络节点。这意味着如果复制一个套接字(例如dup),套接字直到关闭了最后一个引用他的文件描述符后才会被释放。而shutdown允许使一个套接字处于不活动的状态,无论他的引用数目是多少
7.处理器架构支持大端字节序,那么最大字节地址对应于最低有效字节:小端字节序则相反:数字最低字节对应于最小字节序地址。注意不管字节如何排序,数字最高位总是在左边,最低位总是在右边
8.与客户端的套接字关联的地址没有太大意义,可以让系统选一个默认地址。然而面对与服务器,需要给一个接受客户端请求的套接字绑定一个众所周知的地址。客户端应有一种方法来发现用以连接服务器地址
9.端口号必须不小于1024,除非该进程具有相应的特权
10.对于因特网域,如果指定IP地址为INADDR_ANY,套接字端点可以被绑定到所有的系统网络接口,意味着可以收到这个系统所安装的所有网卡的数据包。如果调用connect或listen,但没有绑定地址到一个套接字,系统会选一个地址并将其绑定到套接字
11.如果是处理的是面向连接的网络服务,在开始交换数据之前需要在客户端套接字与服务器套接字之间建立一个连接
12.在connenct中所指定的地址是想与之通信的服务器的地址。如果sockfd没有绑定到一个地址,connect会给调用者绑定一个默认地址
13.要连接的服务器必须绑定到一个想与之连接的地址,并且在服务器的等待连接队列中应有足够的空间。
14.如果套接字描述符处于非阻塞模式下,那么在连接不能马上建立时,connect将会返回-1,并将errno设为特殊的错误码,应用程序可以用poll或select来判断文件描述符何时可写,如果可写,连接完成
15.connect也可用于udp,这样每次报文传输就不需要在提供地址
16.服务器调用listen来宣告可以接受连接请求,参数backlog提供了一个请求,用于表示该进程所要入队的连接请求数量。其实际值由系统决定,一旦队列满,系统会拒绝多余的连接请求,所以backlog的值应该基于服务器期望负载和接受连接请求与启动服务的处理能力来选择
17.一旦服务器调用了listen,套接字就能接收连接请求,使用函数accept获得链接请求并建立连接
18.函数accept返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符和原始套接字具有相同的套接字类型和地址族。传给accept的原始套接字没有关联到这个链接,而是继续保持可用状态并接受其他的连接请求,如果不关心客户端标识,可以将参数addr和len设为NULL,如果没有连接请求等待处理,accept会阻塞直到一个请求到来。如果sockfd处于非阻塞模式,accept会返回-1并将errno设置为EAGIN
19.如果服务器调用accept并且当前没有连接请求,服务器会阻塞直到一个请求到来。另外,服务器可以使用poll,select来等待一个请求的到来,这种情况下,一个带等待处理的连接请求套接字会以可读的方式出现
20.send返回时,并不必然表示连接的另一端的进程接收数据。所保证的仅是当send成功返回时,数据已经无错误的发送到网络上
21.send会阻塞直到整个数据被传输
22.sendto可以用来无连接的通信,对于无连接的套接字不能使用send,除非在connect时预先设定了地址
23.还可以使用sendmsg进行传输数据

24.当使用MSG_LEEK时,可以查看一下要读的数据但不会真正取走

25.容忍包丢失意味着两个选择。如果想和对方可靠通信,必须对数据包编号,如果发现包丢失,则要求对方重新传输,如果出现重复将其丢弃。另一选择是通过让用户再次尝试命令来处理错误,面向连接更消耗系统资源
26.当服务器终止并尝试立即重启时,函数不会正常工作所谓的端口复用,通常TCP不允许绑定同一个地址,幸运的是套接字选项so_reuseaddr允许越过这个限制
27.TCP将带外数据称为紧急数据,TCP仅支持一个字节的紧急数据,但是允许紧急数据在数据流之外传输
28.通常recb函数没有数据可用时会阻塞等待,同样的当套接字输出队列没有足够空间来消息时函数send会阻塞,在套接字非阻塞模式下,行为会改变。在这种模式下,这些函数不会阻塞而是失败。当这下发生时可使用poll,select来判断何时能再接受和传输数据











0 0