逐步实现TCP服务端Step04-10:小结

整个Step04阶段所做的工作是让后台系统能支持多客户并发。我们的基本设定是,负责网络通信的netio进程,以及负责业务处理的s进程都是单线程结构。要在这个大前提下对系统进行改造。

首先,不论何种结构,总要对多个客户的信息进行维护。对于netio来说,就是围绕socket的一些数据。我们设定了SocketInfo结构去整合它们,每个客户对应一个SocketInfo结构,用一个list去管理。对于s来说,每一个cilent,就是业务的“用户”,这些用户分别有自己的User对象。我们假设了client的socket值,就是它在业务层面的用户ID,这样,s的每个User对象就有了一个用户ID,基于这个ID可以hash到User对象。同时,User对象中会记录client的SocketInfo结构在list中的索引值,这么一来,就能将netio维护的SocketInfo与s所维护的User对象对应起来。

再说netio对list的处理 ...


逐步实现TCP服务端Step04-9:IOCP

IOCP是Windows平台特有的机制,在Windows平台上,它与epoll在Linux上的地位相当。二者常放在一起讨论,不过,它俩完全不是一类东西。

selectpollepoll系列,属于I/O多路复用机制。通过这种机制,就可在单一流程(单线程)中一次性找出,当前I/O已就绪的文件描述符。这大大降低了,程序因不知道哪些I/O已就绪,而无休止地轮询(调用recv/send等)所有文件描述符所产生的大量无用功。当然,多路复用是用在单线程处理多路I/O的场景中,若一路I/O独占一个线程的话,就没必要轮询了,线程直接阻塞在I/O上就行了。

IOCP是配合Overlapped I/O来使用的,这种所谓的重叠I/O是Windows平台上的异步I/O机制。说到同步、异步的概念,在不同场合下有不同解释。单说异步I/O的话 ...


逐步实现TCP服务端Step04-7:select、poll

select是最基本的I/O多路复用函数,Linux及Windows平台均提供支持。pollselect类似,二者的语义都是在给定的时间内对一组文件描述符进行遍历检查,找出其中的就绪者。

  • nfds:要求给出传入集合中最大的文件描述符值+1,内核需要知道这个值已确保其操作能涵盖结合中的所有文件描述符。
  • readfds/writefds/exceptfds ...


逐步实现TCP服务端Step04-6:I/O多路复用

I/O多路复用是一种I/O模式,由OS提供支持。基于该方式,可对多个I/O实施管理。

由进程发起的一次I/O操作,其执行包含两个阶段:1. 准备数据;2. 复制数据。处于用户空间的进程没有直接操作设备的权限,这两步操作都由内核完成。第一步所谓的准备数据,指的是内核将设备中的数据取到内核缓冲中。比如当收到一个完整TCP报文段时,其携带的数据会被存到内核缓冲中,此时的状态就是数据准备已就绪。第一步就绪后,第二步则会将内核缓冲中的数据拷贝到进程空间中的指定区域(用户缓冲 ...


TCP半关闭的必要性

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


网线断了是什么状态-续

之前测试的场景是两个主机直接连接,中间没有其他设备。在现实情况中,这种做法几乎是不存在的。一端连接主机的网线,其另一端通常接入的是交换机,集线器之类的网络设备。

在这种情况(除接入一个交换机之外,其他设定与之前相同)下,执行前篇进行的各种操作,可能会有不同的结论 ...