2016-01-30 ALEX LIN
iOS网络编程层次结构 iOS网络编程层次结构分为三层,从上往下依次为: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices OS层:基于 C 的 BSD Socket Cocoa层:是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API。Cocoa 层是基于 Core Foundation 实现的。 Core Foundation层:因为直接使用 socket 需要更多的编程工作,所以苹果对 OS 层的 继续阅读 »
2015-07-28 张炎泼
对于一个tcp连接,在c语言里一般有2种方法可以将其关闭: c close(sock_fd); 或者 c shutdown(sock_fd, ...); more 多数情况下这2个方法的效果没有区别,可以互换使用。除了: 继续阅读 »
2015-07-06 刘太华
网关编码一 拆了又补, 补了又拆,边拆边想,发现之前用asio socket的方式做gateway, 有不少问题。 1. 如果用asio做连接upstream server的socket, 还需要把byte buffer实现一遍, 虽然已有现成的buffer代码, 不过生搬过去还是显的略繁琐; 2. 如果用asio, 下游用的是epoll, 要在asio的async_read_some, 和epoll的 OnRead, OnWrite间穿梭, 感觉好脑残,之前的想法果然傻逼, 当然推翻它重来了; 3. 改成都用epoll监听, 方便很多。基本上就是设计一个新类 ProxySClientSocket 继承SClie 继续阅读 »
2015-08-27 Li Shuai
同步IO Linux IO的两阶段 同步, 异步, 阻塞, 非阻塞, 是网络IO中经常被提到的概念, 刚接触Tornado服务器的时候也知道Tornado是异步非阻塞的高性能web服务器, 直到最近看了一些资料才对同步异步的概念有了一些自己的想法。 HTTP协议是构建在TCP协议上的, TCP通信的底层本质上是socket的IO, 在Linux上, 以读socket为例, 数据首先到达的是内核缓冲区, 其次才会从内核缓冲区拷贝到用户进程, 所以负责通信的进程去读写socket的时候(也即recvfrom调用), 一般是两个阶段: 等待数据准备好, 此时数据暂存在内核缓冲区 数据准备好, 从内核缓冲区拷贝到用户进程 以上的两阶 继续阅读 »
2016-11-07 ruki
tbox内部的所有io操作都是原生支持协程的,可以在线程和协程间任意切换,内置基于轮询的io调度器(epoll, kqueue等,后续还会支持iocp). 我们在socket操作的时候,只需要像平常顺序编程那样操作就可以实现异步并发收发数据。 这里先给个简答的文件服务器的例子,可参考下,代码非常简单: 文件接收服务器 这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。 通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。 此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不需要再上层开buffe 继续阅读 »
2015-06-18 刘太华
gateway的初步想法 已有一套基于epoll event的框架, 打算gateway在这个基础上, 配合boost::asio做。雏形先做个socket proxy出来. TODO: 1,设计一个AsioClient类, 它是gw到后端具体gs的连接封装. AsioClient类想到2个方案: a, 在原来的面向玩家的SClientSocket类和AsioClient类之间做friend, asio_write, asio_read, asio_connect的callback中, 回调SClientSocket中的对应Write, Read达到与epoll 事件打通, 因此打通玩家到后端gs的proxy 继续阅读 »
2016-12-07 ruki
之前介绍过了stackfull的一些服务器使用例子,这里在贴一些使用stackless协程接口实现的server代码。 其实大部分接口,两者都是类似的,仅仅只是前缀的区别:tb_co_xx 和 tb_lo_xx,唯一需要注意的是: * stackless协程尽量不要使用局部变量 * 不要再嵌套的过程里面进行协程挂起等待 文件接收服务器 这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。 通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。 此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不 继续阅读 »
2016-10-29 ruki
tbox的协程实现,是stackfull模式的,需要指定独立堆栈和协程函数,目前暂时还不能像golang那样实现堆栈的动态增长,之后会对其进行支持。 目前提供下面一些功能特性: 1. 提供yield切换调度支持,这个是必须的哈 2. 提供suspend(挂起)/resume(恢复)协程接口,不同于yield的是,被suspend后,如果不显示调用resume恢复它,是永远不会被调度到的 3. 提供sleep等待接口支持 4. 提供io调度支持,支持socket等io等待(内部使用epoll, poll, kqueue, select, poll等接口调度) 5. 原生支持stream,socket,http等模块的协程支持,可 继续阅读 »
2015-04-08 刘太华
首先, 单个socket是面向玩家的, 以此展开的会有,这个玩家,也就是说这个socket,会拥有一个gameWorld, 以及在玩家login之前, 所有玩家都面向的gameHolder, Holer处理登陆, 已登陆玩家数据网络层将推送给Player类处理。 transfer和gameHoler, gameWorld, Player之间,各使用3个线程安全的数据队列m_DataQueue. m_DataQueue的类型是 FastQueue m_DataQueue; 它的原型是: {} template class FastQueue { struct node { T element; 继续阅读 »
2018-06-21 Vaniot
预操作 加速器 修改/etc/docker/daemon.json 文件并添加上 registry-mirrors键值,将镜像源切换为国内。 shell $ vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } 设置权限 docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,创建docker用户组,并将当前用户加入到docker用户组中,当前用户就有权限访问Unix socket了,就可以执行docker相关命令 继续阅读 »