forthxu 发布的文章

g-o-o-g-l-e i-p-s

#!/usr/bin/python
#-*- coding:utf8 -*-

'''
Created on 2014-06-02
# QQ:263967133
# pings运行一般运行一次就够了,自己选一个ip段
# google ip地址段
# 64.233.160.0 - 64.233.191.255
# 66.102.0.0 - 66.102.15.255
# 66.249.64.0 - 66.249.95.255
# 72.14.192.0 - 72.14.255.255
# 74.125.0.0 - 74.125.255.255
# 209.85.128.0 - 209.85.255.255
# 216.239.32.0 - 216.239.63.255
window下应该只需要把ping参数-c 改成 -n,没测
'''

import time,os
start_Time=int(time.time()) #记录开始时间

# 生成ips
def pings():
    ips=open('host.txt','w')
    for ip3 in range(2, 254):
        ip='66.249.64.'+str(ip3)+"\n"
        # print  ip
        ips.write(ip)
    ips.close()

#判断文件中的ip是否能ping通,并且将通与不通的ip分别写到两个文件中
#文件中的ip一行一个
def ping_Test():
    ips=open('host.txt','r')
    ip_True = open('ip_True.txt','w')
    ip_False = open('ip_False.txt','w')
    count_True,count_False=0,0
    for ip in ips.readlines():
        ip = ip.replace('\n','')  #替换掉换行符
        return1=os.system('ping -c 2 -w 1 %s'%ip) #每个ip ping2次,等待时间为1s
        if return1:
            print 'ping %s is fail'%ip
            ip_False.write(ip+"\n")  #把ping不通的写到ip_False.txt中
            count_False += 1
        else:
            print 'ping %s is ok'%ip
            ip_True.write(ip+"\n")  #把ping通的ip写到ip_True.txt中
            count_True += 1
    ip_True.close()
    ip_False.close()
    ips.close()
    end_Time = int(time.time())  #记录结束时间
    print "time(秒):",end_Time - start_Time,"s"  #打印并计算用的时间
    print "ping通数:",count_True,"   ping不通的ip数:",count_False

# pings()
ping_Test()

gist

php函数crc32存在的问题

中午突然获知AS客户端与服务端c协议通讯时,为了验证完整性和防外挂,服务端要求协议带上crc的验证信息,我做的php后台有Socket形式的GM命令也要求相同的协议。

但php和服务端计算出来的验证值是不同的,然后我试了下python写crc,python和服务端计算后的验证值是相同的。

经过一番搜索,通过文章1文章2得知,在python2.x中 binascii.crc32(v) 求出了v的crc32值,是一个long型,经过 binascii.crc32(v) & 0xffffffff 计算后的验证值跟php一样的,可以说:

php的crc32 = python的 binascii.crc32(v) & 0xffffffff

此文验证结果没错,但原理性内容存在问题,待我学习crc算法,慎读。

- 阅读剩余部分 -

游戏通讯协议

你们用哪一种协议?
1、包长度->版本号->协议号->内容

2、包头标志(比如“|”)->版本号->协议号->内容长度->内容

还有消息包格式的定义,这个曾在云风的blog上展开过激烈的争论。消息包格式定义包括三段,包长、消息码和包体,争论的焦点在于应该是消息码在前还是包长在前,我们也把这个当作是信仰问题吧,有兴趣的去云风的blog上看看,论论。

另外早期有些游戏的包格式定义是以特殊字符作分隔的,这样一个好处是其中某个包出现错误后我们的游戏还能继续。但实际上,我觉得这是完全没有必要的,真要出现这样的错误,直接断开这个客户端的连接可能更安全。而且,以特殊字符做分隔的消息包定义还加大了一点点网络数据量。
引用百万用户级游戏服务器架构设计

lua调用so动态库

今天,我给我的测试软件框架添加了一个 C 模块,里面封装了一个 sleep 的系统调用。我的目的是在用 Lua 时,要延时的话,不用执行 os.execute("sleep 5") 之类的蹩脚语句,而替之以 mt.sleep(5) 之类的就行了。

- 阅读剩余部分 -

skynet目录和文件分析

  • 根目录
    README.md 简单介绍了怎么编译和测试Skynet
    LICENSE 许可证信息,采用MIT,很宽松的协议。
    Makefile 编译规则文件,用于编译Skynet
    platform.mk 编译与平台相关的设置
    3rd 第三方的代码,有lua和jemalloc等
    examples 附带的例子
    lualib 使用lua写的库
    lualib-src 使用C写并封装给lua使用的库
    service 使用lua写的Skynet的服务模块
    service-src 使用C写的Skynet的服务模块
    skynet-src Skynet的核心代码
    test 使用lua写的一些测试代码

skynet简介

skynet是云风编写的服务端底层管理框架,底层由C编写,配套lua作为脚本使用,可换python等其他脚本语言。
skynet默认开启_timer线程、socket线程、_monitor线程以及可配置个数的多个_worker线程,启动skynet服务就是向skynet注册由c编写的so模块实例也就是服务。
skynet主要工作是通过模块注册管理服务,并协调服务之间的调用和通讯。

skynet自带的模块中有一个重要的模块是snlua.so模块,通过snlua.so和指定lua脚本文件可以启动多个lua编写的服务,不用每个服务都是用c来编写,而且大部分逻辑都是在 lua 脚本下开发,只有需要考虑性能的模块才用 C 语言开发成库,直接提供给 lua 调用。 现在 Skynet提供给 lua 使用的库还不多,期望以后这些库多了,可以方便、简单的完成一个网络游戏服务端的开发。

Skynet是服务端的最底层框架,和游戏有关的各种服务都是基于架构之上开发的。服务启动后skynet一般由socket接受外部msg传入内部服务做处理。

PPT简介:http://pan.baidu.com/s/1i3qp7b3

深入理解PHP ob_flush和flush的区别

buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。

这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。

- 阅读剩余部分 -