逐步实现TCP服务端Step02:正确处理流

TCP所提供的是一种面向连接的、可靠的字节流服务。它通过一系列控制机制:流量控制、差错控制、连接管理,令数据从一端顺利地流向另一端。

TCP这种流式服务对其使用者(应用进程)来说,麻烦之处在于:当调用其接口进行数据收发时,其处理粒度是字节,而不是消息(应用层约定的某种格式的数据)。也就是说,若调用发送接口欲投递一个应用层面的消息时,TCP有可能只受理前n个字节;调用接收接口提取数据时,有可能拿到的m个字节不足以构成一个应用层消息,或者可以构成多个消息也不一定。

总之,recv或send的调用次数与收到或发出的完整消息的个数并非是对等的。如何发出完整消息以及如何从一堆字节中解析出完整的消息,是应用层面需要关注的问题。

原始阶段,我们没有定义应用层消息,服务程序只是简单地把收到的字节原样发回去而已。此时 ...


处理C字符串时应该注意到的

字符串是一系列字符的有序排列,一个挨着一个排成一串。若要对一个存放在内存中的字符串进行处理,需要知道其首个字符所在的内存地址和其边界。

对于边界的描述,容易想到的有两种方式:一是在字符串中给出该字符串的长度,知道了长度就可得出边界,像这样:

二是在字符串尾部加一个特殊的字符作为标记,只要看到这个字符,就可认定已经到达了字符串的边界,像这样:

这个字符应是不可打印的,以免与真正需要处理的那部分字符想混淆。

C语言使用的是第二种方法,它用ASCII码为0的字符(’\0 ...


逐步实现TCP服务端Step01:原始阶段

原始阶段:服务端一次只受理一个客户,在对当前客户服务期间,其他客户没机会连进来。这个阶段的服务端做的事情非常简单,就是将收到的字节原封不动地返回去。

由于没有定义消息格式,现阶段不需要实现专用的client程序,测试的时候直接使用telnet或者netcat就可以:

telnet ip port
nc ip port

这里及后续的实现代码都是比较粗糙的,只是为了说明问题,没有做太多的考虑。程序中也没有日志输出,只是个别要关注的地方做了标准输出 ...


逐步实现TCP服务端:index


Linux目录结构

FHS标准对根目录( / )及其下的两个子目录:/usr/var的内部结构和存放的文件进行了限定。 除此之外不做限制。根目录是系统的根本,/usr与系统软件的安装及运行相关,/var与系统本身的运行相关。上面加粗的目录是FHS所定义的目录 ...


TCP半关闭的必要性

TCP所提供的是全双工服务(数据可在两个方向上同时传递),连接建立后,就如同开辟了两条通路。对连接的任一端来说,一条通路用于进数据,另一条用于出数据。 一般说关闭TCP连接,是指某一端调用了close(windows平台为closesocket)函数将自己的两条通路同时断开,其结果就是,它再也不可在socket上收发数据了(TCP会将那些已在发送缓冲中的数据发送出去 ...