第一章:函数式编程简介
我们常用的是命令式编程,它关心“怎么做”,而函数式编程关心“做什么”。通俗来讲,函数式编程更关注结果的定义,而命令式编程更关注实现的步骤
不要用 TIME-WAIT暗杀来关闭一条连接
不幸的时,TIME-WAIT 状态可以被提前终止,这被称为 TIME-WAIT 暗杀。它可能时“碰巧”产生的,也可能是故意造成的。不管是哪种情况,提前终止 TIME-WAIT 状态 都是不明智的
使用前将结构sockaddr_in清零
因为必须要将 sin_zero 清零,所以在使用之前,将整个地址结构清零就成了一种惯常的做法。通过这种方式,可以清除所有其它字段,而且还可以避免于未正式说明的字段及用法发送可能的冲突
不要低估 TCP 的性能
我们预计,应用程序中仅包含简单的请求/应答会话时,UDP 的性能会比 TCP 好,当连接持续的时间很长,并且传输了大量数据时,TCP 的性能会比 UDP 好得多。实际情况中,还需要各写一份代码进行测试
高并发、高可用和高性能
通过此文弄清楚网络中常见的高并发、高可用和高性能的概念
水平触发和边缘触发
很多时候你没有理解水平触发和边缘触发的区别,那是没有具体实践导致的,本文通过实际的现象和解释来讲清楚二者的区别
网络编程中结构体的区分
sockaddr 结构体是为了统一地址结构的表示方法,统一接口函数,但是这个结构体并不方便使用,因此定义了等价的 sockaddr_in 结构体,它的大小和 sockaddr 结构体相同,可以强制转换成 sockaddr。因此,在实际的网络编程中,先定义 sockaddr_in结构体把相关信息存储之后,再强制转换成 sockaddr,毕竟提供的API接受的类型是 sockaddr
主机字节序和网络字节序
在网络编程中,数据收发的过程中有自动转换机制,不需要程序员手动转换,只有向 sockadd_in 结构体成员变量填充数据时,才需要考虑字节序的问题
服务器应该设置SO_REUSEADDR选项
有些人,而且包括很多写书的人,都认为设置SO_REUSEADDR是很危险的,因为这样就允许创建相同的TCP四元组了,会引发问题。这种看法是不对的。在写网络服务器的时候,我们务必设置SO_REUSEADDR选项,这对我们有益无害
理解TCP的有序释放操作
有序释放的目的是确保两端都能在连接拆除之前收到所有来自其对等实体的数据