gevent gevent.queue gevent读取文件

2019-01-30
阅读 6 分钟
2.9k
gevent 一种异步的方式,基于事件循环..   跟 asyncio 里的东西运作的差不多 官方手册说的太不清楚 .  自己写了个入门教程. 一个最简单的例子: spawn 将把你的函数封装成一个个协程对象 {代码...} 下面的例子中. 我不再使用gevent.Greenlet 来自己创建了,比较麻烦.直接spawn了 。 下面的例子里,我也不再使用继承的Greenle...

完成端口服务器模型

2019-01-17
阅读 7 分钟
2.4k
前提: IOCP的整体编程模型跟上面的纯重叠io 非常类似.  纯重叠io使用OVERLAPPED  + APC函数完成. 这种模型的缺点是必须让调用apc函数进入alterable状态. 而IOCP解决了这个问题.IOCP让我们自己创建一些线程, 然后调用GetQueuedCompletionStatus 来告诉我们某个io操作完成, 就像是在另一个线程中执行了APC函数一样;   使用...

set_new_handler

2019-01-07
阅读 2 分钟
1.1k
std::set_new_handler 用于如果 new 失败就调用此函数; {代码...} 只要new 失败则一直调用此函数 , 直到有足够的内存为止, 意图在让你去释放一些内存; set_new_handler(0); 用来还原 如果有需求一般写一个父类去实现: {代码...}

iterator_traits获取迭代器类型

2019-01-07
阅读 3 分钟
2.5k
结论: std::iterator_traits 用于Iterator类型 比如有这么一个需求,给随意的一个迭代器移动距离 , 伪代码: {代码...} 问题是如何判断一个迭代器类型 ,使用 iterator_traits; 前提 , 5种迭代器是继承关系 ,随意看一眼即可: {代码...} 看一下iterator_traits: {代码...} iterator_traits 和 remove_reference 内部实现差不...

膨胀的template class成员函数

2019-01-06
阅读 2 分钟
2k
将产生2个类, 2份insert实现(如果有调用的话)膨胀的template class 的原因是参数因此让目标代码膨胀减少的方法是,提取一个template父类:

模版基类引出的问题

2019-01-05
阅读 1 分钟
2.3k
1.我们都知道 TBase<int> , TBase<char> ... 等等实例化的类 互相都没有关系;2.特化本质上就是接管了编译器的工作 ; 比如 template<> class TBase<int>{...} 相当于 接管了编译器去生成TBase<int>;

私有继承的一些作用

2019-01-04
阅读 1 分钟
3.1k
先给结论: {代码...} 与public继承的区别是 父类的所有接口都不可用了(变为private) ,换句话说: {代码...} 通过上面可知与public继承的区别了; 那private继承用来干嘛?? 比如有这么一个时间类 , 另一个widget也想有超时的功能: {代码...} 像类似这种情况下就可以使用 private 继承 ;如果改成public 继承或许有些奇怪, 比...

public继承中的虚函数与private/protected的区别

2019-01-04
阅读 1 分钟
2.1k
现在呢 : Person p = new Student //conversion from 'Student ' to 'Person *' exists, but is inaccessible原因: 此时父类接口都是protected, 外部已经无法访问;但virtual函数依然存在, 在内部依然可以使用;

构造析构函数发生异常 与 inline

2019-01-04
阅读 1 分钟
1.6k
inline 构造析构函数发生异常 1.inline 函数就是 : 申请对此函数的每个调用都用 函数本体替换; {代码...} {代码...} 2.构造析构函数异常与inline {代码...} {代码...} 以上Derived的构造函数在编译后大概是这样的: {代码...} 通过上述代码可以发现,如果Base构造是inline, Derived也是inline的话,Base的构造函数代码将被...

异步io通知 WSAEventSelect

2018-12-28
阅读 6 分钟
2.1k
WSAEventSelect 就是 select的增强版; 注意WSAEventSelect 是通知异步, 而不是传送数据异步; 总的来说就是一个异步的阻塞模型; 如果要与 select 做个比较的话 : select 在 需要进行或者可以进行io处理时 返回. 而WSAEventSelect 在返回时(WSAWaitForMultipleEvents) 与io状态无关; 例如: select 在收到数据 并返回时 , ...

epoll select的限制 条件触发 边缘触发

2018-12-26
阅读 9 分钟
2.7k
结论: epoll 要优于 select , 编程模型基本一致; {代码...} 题外话: 在io复用中把监听套接字设为非阻塞 觉得理论麻烦的,可以直接往下拉,有代码例子; select 的缺陷: {代码...} {代码...} {代码...} {代码...} {代码...} epoll 解决了select缺陷;epoll 给每个需要监听的描述符都设置了一个或多个 event : {代码...} epoll...

在io复用中把监听套接字设为非阻塞

2018-12-26
阅读 1 分钟
2.3k
往往在select 或 epoll 中把 listen_socket 设置为非阻塞 O_NONBLOCK原因是出在 accept 上, 比如有这么一个客户端: RST客户端

标准io 与 shutdown 半关闭

2018-12-24
阅读 2 分钟
1.5k
把文件描述符转标准io FILE 时 (例如: FILE readfp = fdopen(fd,"r") )如果需要半关闭, 不能使用fclose ,fclose 将直接关闭(close)套接字还是需要shutdown 来帮忙 (例如 shutdown(fileno(readfp),SHUT_WR) ) ,先把 FILE* 转描述符,再调用shutdown;

多播

2018-12-23
阅读 3 分钟
1.4k
多播基于udp,让路由器复制数据包传递 基本和udp 程序一样 不同的地方: 对于发送者重要的 , 1 发送数据不再直接发送到对端,而是发送到多播地址, 但端口还是对端的端口(否则对端套接字无法接受到数据), 这样通过路由器复制再转发, 对端recvfrom 的ip 将是路由器 2 多播ttl (默认1, 还是修改一下保险一些); {代码...} 对于...

获取外出接口

2018-12-23
阅读 1 分钟
1.2k
getsockname : 获取本机socket信息 ( 源ip/port) {代码...}

检查win错误信息

2018-12-22
阅读 1 分钟
1.3k
就一个函数FormatMessage {代码...}

select 服务器 客户端 缩水版

2018-12-21
阅读 5 分钟
1.7k
tcpserver.c {代码...} tcpclient.c {代码...}

udp connect

2018-12-21
阅读 2 分钟
3.2k
在udp 上使用connect 的情况: 需要获取icmp 的错误信息. 2.如果需要向同一个ip地址多次 sendto , 用以减少不断的连接,断开.提高性能 注意: udp 的connect 只记录(注册)对端的套接字结构(ip,port) , 并不会像tcp 进行3次握手.所以无法第一时间获取连接错误; 这种称为有连接的udp套接字 也只能 发送/接受 connect中的指定...

用于消耗服务器资源的rst工具

2018-12-21
阅读 1 分钟
1.4k
以下代码可自行修改成 用于大量消耗服务器资源的工具. 主要SO_LINGER 选项.  作用于close时, 直接发送 rst; 例子: {代码...}

readv writev 简介 一次读写多个缓冲区

2018-12-21
阅读 1 分钟
2.5k
一个小例子说明函数使用: 结构说明: {代码...} {代码...}

MSG_OOB winsock

2018-12-21
阅读 4 分钟
1.6k
unix中的msg_oob msg_oob in unixcwin下没有unix中的信号, MSG_OOB的解决方式是 使用select 中的异常套接字: exceptfds

MSG_OOB unixc

2018-12-21
阅读 3 分钟
2.1k
MSG_OOB : 仅仅是通过tcp头的urgent 模式传送的, {代码...} 需要注意: 此类数据通过信号 SIGURG 来通知 ,所以需要使用 signal / sigaction 来注册一个信号处理函数. 在signal 之前首先需要 fcntl(clientfd,F_SETOWN,getpid()) 由于此信号是由套接字产生的, 而套接字的拥有者是操作系统 . 只有把套接字的拥有者设置为当前...