Tag Archives: 网络

异步事件模型的 Self-pipe trick

异步事件模型中有一个重要问题是,当你的 select/poll 循环陷入等待时,没有办法被另外一个线程被唤醒,这导致了一系列问题: 1)在没有 pselect/ppoll 的系统上,信号无法中断 select/poll 等待,得不到即时处理; 2)另一个线程投递过来的消息,由于 select/poll 等待,无法得到即时处理; 3)调短 select/poll 的超时时间也无济于事,poll 的超时精度最低 1ms,粗糙的程序可能影响不大,但精细的程序却很难接受这个超时; 4)有的系统上即便你传了 1ms 进去,可能会等待出 15ms 也很正常。 比如主线程告诉网络线程要发送一个数据,网络线程还在 select/poll 那里空等待,根本没有机会知道自己自己的消息队列里来了新消息;或者多个 select/poll 循环放在不同线程里,当一个 accept 了一个新连接想转移给另一个时,没有办法通知另一个醒来即时处理。 解决这个问题的方法就叫做 self-pipe trick,顾名思义,就是创建一个匿名管道,或者 socketpair,把它加入 select/poll 中,然后另外一个线程想要唤醒它的话,就是往这个管道或者 socketpair 里写一个字节就行了。 类似 java 的 nio … Continue reading

Loading

Posted in 网络编程 | Tagged | 5 Comments

WinSock 可以把 SOCKET 类型转换成 int 保存么?

在 Linux/Unix 等 posix 环境中,每个套接字都是一个文件描述符 fd,类型是 int,使用起来非常方便;但在 Win32 环境中是 SOCKET 类型被定义成 UINT_PTR ,是一个指针,在 x64 环境中一个 SOCKET 占用 8 个字节。 那么是否能将 SOCKET 类型强制转换成 int 类型保存没?这样就能统一用 int 在所有平台下表示套接字了,同时在 x64 环境下这样将 64 位的指针转换为 32 位的整数是否安全? 答案是可以的,下面将从三个方面说明一下。 Kernel Object 每个 SOCKET 背后其实都是一个指向 Kernel Object … Continue reading

Loading

Posted in 网络编程 | Tagged , | Leave a comment

WinSock 的 select 如何超过 64 个套接字限制?(三种方法)

在做跨平台网络编程时,Windows 下面能够对应 epoll/kevent 这类 reactor 事件模型的 API 只有一个 select,但是却有数量限制,一次传入 select 的 socket 数量不能超过 FD_SETSIZE 个,而这个值是 64。 所以 java 里的 nio 的 select 在 Windows 也有同样的数量限制,很多移植 Windows 的服务程序,用了 reactor 模型的大多有这样一个限制,让人觉得 Windows 下的服务程序性能很弱。 那么这个数量限制对开发一个高并发的服务器显然是不够的,我们是否有办法突破这个限制呢?而 cygwin 这类用 Win32 API 模拟 posix API 的系统,又是如何模拟不受限制的 … Continue reading

Loading

Posted in 网络编程 | Tagged | Leave a comment

互联网技术比游戏后端技术领先十年吗?

最近时间线上又起了一场不大不小的论战,做互联网的人觉得游戏服务端发展很慢,同时互联网技术日新月异,似乎觉得互联网技术领先了游戏后端技术十年,这个结论显然是武断的,几位朋友也已经驳斥的很充分了,游戏服务端的同学实属没必要和这个互联网的人一般见识,本来就此打住也还挺好。 但最近两天事情似乎正在悄悄起变化,时间线上一直看到不停的有人跳出来,清一色的全在说互联网简单,什么做个电商不过就是 CRUD 的话也出来了,看的我也大跌眼镜,过犹不及吧。 今天更是又刷到有几位不管不顾就说什么游戏服务端领先互联网十年什么的,似乎这又要成为了另外一个极端了,那么有几点情况是不是也请正视一下: 1)游戏服务端足够复杂,但是发展太慢,祖传代码修修补补跑个十多年的不要太多。能用固然是好事,但没有新观念的引入,导致可用性和开发效率一直没有太多提升。 2)各自闭门造车,没有形成行业标准与合力,这个项目的代码,很难在另一个项目共享,相互之间缺少支持和协同。 3)互联网后端随便拎出一个服务来(包括各种 C/C++ 基建)大概率都没有游戏服务端复杂,但最近十年日新月异,形成了很强的互相组合互相增强的态势。 我上面指的是互联网基建项目,不是互联网 CRUD,互联网近十年的发展,让其整体可用性,效能,开发效率,都上了很多个台阶,不应一味忽视。 如果继续觉得游戏服务端领先互联网十年可以直接右转了,开放心态的话我也可以多聊一些(点击下方 more 阅读更多):

Loading

Posted in 游戏开发, 网络编程 | Tagged , , | 5 Comments

网游通信协议如何防止封包篡改?

第一层:协议非对称加密交换密钥,对称加密传输内容,保护好服务端私钥,防止中间人攻击。流式加密,同样包发两次内容不一样。 第二层:不用标准序列化工具如 protocolbuf,用修改版或者自己实现的。 第三层:客户端加密加壳防止调试和注入,程序签名防止篡改二进制。 第四层:重要代码放虚拟机或者脚本里运行(脚本字节码需需改),一般黑客主要分析反汇编,你复杂逻辑多套几层他就晕了。 第五层:关键数据不落内存,一律使用 getxx,setxx 之类的接口,后面将真实数据经过变换以后才落内存。 第六层:守护进程动态跟踪监控情况。 第七层:决定性逻辑永远放在服务端。 第八层:服务端定期校验消息合理性,比如十秒内最大的移动步长是多少,实际发上来的合理不合理,不合理就踢掉,比如按键点击频率是否超过正常人。 第九层:不定期弹出反外挂答题,答正确奖励经验,错误就掉线。 第十层:必须要放在客户端计算的内容将输入和结果 hash 同步给其他客户端验算,不对就踢掉。 第十一层:当检测到客户端触碰到某规则不要急着踢掉它,而是有概率被踢掉,还要随机几秒踢掉,这样黑客发现一会这里断一会那里断,就蒙圈了。 第十二层:发现某黑客/外挂工具利用某漏洞破解了游戏,先看影响大不大,再看他挣不挣钱,影响一般又不挣钱的话可以先养着他,等他挣钱了用户多了,大型活动之前,一条指令就把它封了,用户退款都可以弄得他爬不起来。 。。。。。 手机打字慢,先写这些,没有绝对安全,就是合理的策略加攻防成本。

Loading

Posted in 游戏开发 | Tagged | 2 Comments

新版瑞士军刀:socat

我在《用好你的瑞士军刀:netcat》中介绍过 nc 和它的几个实现(bsd, gnu, nmap),netcat 还有一个最重要的变种 socat (socket cat),值得花一篇完整的文章介绍一下,它不仅语义统一,功能灵活,除了完成 nc 能完成的所有任务外,还有很多实用的用法: 基本命令就是: socat [参数] <地址1> <地址2> 使用 socat 需要提供两个地址,然后 socat 做的事情就是把这两个地址的数据流串起来,把第左边地址的输出数据传给右边,同时又把右边输出的数据传到左边。 最简单的地址就是一个减号“-”,代表标准输入输出,而在命令行输入: socat – – # 把标准输入和标准输出对接,输入什么显示什么 就会对接标准输入和标准输出,你键盘敲什么屏幕上就显示什么,类似无参数的 cat 命令。除了减号地址外,socat 还支持:TCP, TCP-LISTEN, UDP, UDP-LISTEN, OPEN, EXEC, SOCKS, PROXY 等多种地址,用于端口监听、链接,文件和进程读写,代理桥接等等。 因此使用 … Continue reading

Loading

Posted in 网络编程 | Tagged , | Leave a comment

支持 Win10 的网络环境模拟(丢包,延迟,带宽)

升级 Windows 10 以后,原来各种网络模拟软件都挂掉了,目前能用的就是只有 clumsy: 唯一问题是不支持模拟带宽,那么平时要模拟一些糟糕的网络情况的话,是不太方便的,而开虚拟机用 Linux tc 或者设置个远程 linux 网关又很蛋疼,于是我顺便给他加了个带宽模拟功能: 注意最下面的 “Bandwidth” 选项,打上勾的话,就能顺利限速了,注意上面的 Filtering 需要填写正确的 WinDivert 规则。 注意,统计包大小时用的是整个 IP 包的大小(包括各种协议头),所以你设置成 500 KB/s 的话,实际按 tcp 计算的下载速率会略小。 二进制下载: clumsy-bandwidth-win32.zip clumsy-bandwidth-win64.zip 想自己检查自己编译的话: https://github.com/skywind3000/clumsy 欢迎 PR。

Loading

Posted in 网络编程 | Tagged | Leave a comment

用好你的瑞士军刀/netcat

Netcat 号称 TCP/IP 的瑞士军刀并非浪得虚名,以体积小(可执行 200KB)功能灵活而著称,在各大发行版中都默认安装,你可以用它来做很多网络相关的工作,熟练使用它可以不依靠其他工具做一些很有用的事情。 最初作者是叫做“霍比特人”的网友 Hobbit hobbit@avian.org 于 1995 年在 UNIX 上以源代码的形式发布,Posix 版本的 netcat 主要有 GNU 版本的 netcat 和 OpenBSD 的 netcat 两者都可以在 debian/ubuntu 下面安装,但是 Windows 下面只有 GNU 版本的 port。 不管是程序员还是运维,熟悉这个命令都可以让很多工作事半功倍,然而网上基本 90% 的 netcat 文章说的都是老版本的 OpenBSD 的 netcat,已经没法在主流 linux … Continue reading

Loading

Posted in 网络编程 | Tagged , | Leave a comment