随笔分类 - 网络程序
摘要:本文并不打算介绍边界触发模式,需要了解的朋友自己到网上搜索.本文只是打算介绍近期总结的三种边界触发模式的实现方式,后面会实现每一种然后做一个性能比较.1)模仿windows完成端口的模式.这是最早的时候想到的一种方法,并且已经用C++实现过.大概结构这样的,定义了一个IO请求结构,类似于IOCP的OVERLAP结构:struct OVERLAP{ void *buf; int bytetransfer; int errcode;};然后是一个对应用不透明的socket结构:struct socket_t{ volatile int readable; volati...
阅读全文
摘要:unix一个传统的服务器模型就是一连接一进程模型。进程对地址空间的保护作用是显而易见的,为某个连接服务的进程出现错误导致崩溃,其它的进程还能正常的运行。但是,当连接数大时,创建过多的进程显然会影响效率。那么启动一系列的进程,每个进程都利用epoll为多个连接服务,不是就可以避免创建过多的进程,同时也利用到了进程地址空间保护的优势了吗?但是还有一个问题,我们不能为每一个进程都创建一个监听套接口。unix系统还有一个特性,就是可以将一个文件描述符传递给其它进程,方法有很多,unix域套接字是其中一种办法。利用unix域套接字传递文件描述符,就可以用一个进程监听套接口,将到来的连接传递给其它进程,由
阅读全文
摘要:接上篇,本文介绍发送封包的设计.WPacket的构成与RPacket类似,实际数据都存放在buffer组成的链表中.发送时,如果一个WPacket的数据跨越了两个buffer,可通过WSASend提交多个缓冲,一次性将数据发出去.WPacket还提供了一个传入RPacket的构造函数,以方便网关类程序收到一个包就马上将其转发的需求.一般情况下,从一个RPacket构造的WPacket都不需要向其写入新的数据,而是直接转发.所以.构造的这个WPacket和传入的RPacket是共享buffer的.这样大大减少了内存拷贝的次数.当第一次向这个WPacket写入数据时,将会触发拷贝过程,将RPack
阅读全文
摘要:网络程序,为了提高程序的性能,应尽量减少内存的拷贝次数。以windows IOCP为例,complete线程在接收到数据后,应该马上将接收到的数据拷贝到解包缓存,然后立即发起一次新的WSARecv操作。然后再对解包缓存执行操作,解析出逻辑包。通常的方法是将数据拷贝到一个环形缓冲中,以减少数据的拷贝次数。但在解出一个数据包之后,免不了还要将一个完整的数据包拷贝到另一个包缓存中,再将这个包提交给应用层处理.本文介绍一种,拼包方式,以避免从解包缓存copy数据到逻辑包中.首先介绍逻辑包的组织结构://RPacket数据可跨越多个bufferclass RPacket{ friend class...
阅读全文

浙公网安备 33010602011771号