水平触发和边缘触发
很多时候你没有理解水平触发和边缘触发的区别,那是没有具体实践导致的,本文通过实际的现象和解释来讲清楚二者的区别
网络编程中结构体的区分
sockaddr 结构体是为了统一地址结构的表示方法,统一接口函数,但是这个结构体并不方便使用,因此定义了等价的 sockaddr_in 结构体,它的大小和 sockaddr 结构体相同,可以强制转换成 sockaddr。因此,在实际的网络编程中,先定义 sockaddr_in结构体把相关信息存储之后,再强制转换成 sockaddr,毕竟提供的API接受的类型是 sockaddr
主机字节序和网络字节序
在网络编程中,数据收发的过程中有自动转换机制,不需要程序员手动转换,只有向 sockadd_in 结构体成员变量填充数据时,才需要考虑字节序的问题
服务器应该设置SO_REUSEADDR选项
有些人,而且包括很多写书的人,都认为设置SO_REUSEADDR是很危险的,因为这样就允许创建相同的TCP四元组了,会引发问题。这种看法是不对的。在写网络服务器的时候,我们务必设置SO_REUSEADDR选项,这对我们有益无害
理解TCP的有序释放操作
有序释放的目的是确保两端都能在连接拆除之前收到所有来自其对等实体的数据
理解TCP的写操作
对 TCP 连接使用写操作时,最好将写操作理解成将数据复制到发生队列,并通知 TCP 此队列中有新数据的一种操作。实际上,写操作返回时,写操作写出的部分或全部数据可能还在排队等待传输,所以,此时不管是主机还是对等应用程序崩溃了,数据都会丢失
要认识到TCP是一个可靠的,但并不绝对可靠的协议
我们会误以为只要基于 TCP 编程,那么通信的数据必然能够到达对端主机,毕竟 TCP 是可靠的传输协议。然而, TCP 是处在传输层的协议,其可靠性只针对传输层,但是消息最终要达到应用层才算有价值。从传输层到应用层的消息会不会出现问题,可不由 TCP 来保证
记住:TCP是一种流协议
TCP 是一种流协议,这就意味着数据是以字节流的形式传递给接收者的,没有固有的”报文”或”报文边界”的概念。从这方面来说,读取 TCP 数据就像从串行端口读取数据一样——无法预先得知在一次指定的读调用中会返回多少字节
基本套接字 API 的回顾
网络编程必备的基础 API 应用知识
记住:TCP不是轮询的
TCP 不提供连接丢失即时通知最重要的原因与其主要设计目标之一有关:出现网络故障时维护通信的能力。国防部赞助的一项研究要提供一种即使在发生战争或自然灾害这种严重网络损坏的情况下,也能维护可靠网络通信的网络协议,TCP就是这种研究的产物
111121314