<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>benegg blog</title>
	<atom:link href="http://www.benegg.com/game/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.benegg.com/game</link>
	<description>网络游戏技术-娱乐-资讯博客, 国内外有意思的网游信息, 新奇的手机游戏, MMORPG网络游戏引擎开发</description>
	<pubDate>Mon, 30 Aug 2010 03:39:20 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<item>
		<title>令人惊艳的iPhone外壳</title>
		<link>http://www.benegg.com/game/archives/63.html</link>
		<comments>http://www.benegg.com/game/archives/63.html#comments</comments>
		<pubDate>Mon, 30 Aug 2010 03:33:08 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[科技玩意]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.benegg.com/game/archives/63.html</guid>
		<description><![CDATA[
这款惊艳的iPhone外壳(Vapor)有多种颜色. 它包裹在你的iPhone 4的边缘. 在它的内侧, 有一些橡胶, 这样可以给你的iPhone提供一些减震保护.
虽然外表漂亮, 但是79.95美元的价格不适合每一个人.
]]></description>
			<content:encoded><![CDATA[
			<p><a href="http://www.benegg.com/game/wp-content/uploads/2010/08/vapor.jpg"><img src="http://www.benegg.com/game/wp-content/uploads/2010/08/vapor.jpg" alt="" title="vapor" class="alignnone size-full wp-image-64" /></a></p>
<p>这款惊艳的iPhone外壳(<a href="http://www.elementcase.com/iphone4.html">Vapor</a>)有多种颜色. 它包裹在你的iPhone 4的边缘. 在它的内侧, 有一些橡胶, 这样可以给你的iPhone提供一些减震保护.</p>
<p>虽然外表漂亮, 但是79.95美元的价格不适合每一个人.</p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/63.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>魔兽世界: 巫妖王之怒将于2010年8月31日在中国投入运营</title>
		<link>http://www.benegg.com/game/archives/60.html</link>
		<comments>http://www.benegg.com/game/archives/60.html#comments</comments>
		<pubDate>Sat, 28 Aug 2010 05:59:25 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网游娱乐资讯]]></category>

		<category><![CDATA[巫妖王之怒]]></category>

		<category><![CDATA[暴雪]]></category>

		<category><![CDATA[网易]]></category>

		<category><![CDATA[魔兽世界]]></category>

		<guid isPermaLink="false">http://www.benegg.com/game/archives/60.html</guid>
		<description><![CDATA[
2010年8月24日, 中国, 上海 - 暴雪公司和网易公司共同宣布, "魔兽世界: 巫妖王之怒"将于当年8月31日在中国大陆投入运营.
"我们非常感谢中国玩家对魔兽世界的热情和支持, 所以我们非常努力的让"巫妖王之怒"能给玩家带来顶级的体验"暴雪CEO Mike Morhaime说.
"'魔兽世界'是中国最流行的网络游戏之一, 我们相信, '巫妖王之怒'的新内容一定可以给玩家带来更多的乐趣, 我们已经完全准备好了."网易CEO丁磊说.
"魔兽世界: 巫妖王之怒"将把玩家带入冰冷严峻的Northrend大陆, 类似"冰封王座"的场景.
原文: http://us.blizzard.com/en-us/company/press/pressreleases.html?100823
]]></description>
			<content:encoded><![CDATA[
			<p><a href="http://www.benegg.com/game/wp-content/uploads/2010/08/warcraftchina.jpg"><img src="http://www.benegg.com/game/wp-content/uploads/2010/08/warcraftchina.jpg" alt="" title="warcraftchina" width="280" height="148" class="alignright size-full wp-image-61" /></a><br />
2010年8月24日, 中国, 上海 - 暴雪公司和网易公司共同宣布, "魔兽世界: 巫妖王之怒"将于当年8月31日在中国大陆投入运营.</p>
<p>"我们非常感谢中国玩家对魔兽世界的热情和支持, 所以我们非常努力的让"巫妖王之怒"能给玩家带来顶级的体验"暴雪CEO Mike Morhaime说.</p>
<p>"'魔兽世界'是中国最流行的网络游戏之一, 我们相信, '巫妖王之怒'的新内容一定可以给玩家带来更多的乐趣, 我们已经完全准备好了."网易CEO丁磊说.</p>
<p>"魔兽世界: 巫妖王之怒"将把玩家带入冰冷严峻的Northrend大陆, 类似"冰封王座"的场景.</p>
<p>原文: <a href="http://us.blizzard.com/en-us/company/press/pressreleases.html?100823">http://us.blizzard.com/en-us/company/press/pressreleases.html?100823</a></p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/60.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>永恒之塔(Aion)宠物系统抢先看</title>
		<link>http://www.benegg.com/game/archives/59.html</link>
		<comments>http://www.benegg.com/game/archives/59.html#comments</comments>
		<pubDate>Tue, 04 May 2010 04:00:55 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网游娱乐资讯]]></category>

		<category><![CDATA[Aion]]></category>

		<category><![CDATA[pet]]></category>

		<category><![CDATA[永恒之塔]]></category>

		<guid isPermaLink="false">http://www.benegg.com/game/archives/59.html</guid>
		<description><![CDATA[永恒之塔2.0加入了许多种宠物, 可以用金币购买, 也可以通过做任务获得. 一共有5种宠物可选:

装饰宠物: 此类宠物没有特殊技能, 不过非常漂亮可爱.
预警宠物: 此类宠物可以在你的敌人接近你时发出警报.
回报宠物: 好好的喂养你的宠物, 然后会收到它的特殊礼物哦.
袋子宠物: 用来运输.
组合型宠物: 拥有上面几种技能的宠物.

不过, 国内的用户可有得等了, 大家还是催催盛大吧.



]]></description>
			<content:encoded><![CDATA[
			<p>永恒之塔2.0加入了许多种宠物, 可以用金币购买, 也可以通过做任务获得. 一共有5种宠物可选:</p>
<ul>
<li>装饰宠物: 此类宠物没有特殊技能, 不过非常漂亮可爱.</li>
<li>预警宠物: 此类宠物可以在你的敌人接近你时发出警报.</li>
<li>回报宠物: 好好的喂养你的宠物, 然后会收到它的特殊礼物哦.</li>
<li>袋子宠物: 用来运输.</li>
<li>组合型宠物: 拥有上面几种技能的宠物.</li>
</ul>
<p>不过, 国内的用户可有得等了, 大家还是催催盛大吧.</p>
<p><img src="http://img5.mmo.mmo4arab.com/news/2010/05/01/aion_2_0_pet/big_09.jpg" /></p>
<p><span id="more-59"></span><br />
<img src="http://img3.mmo.mmo4arab.com/news/2010/05/01/aion_2_0_pet/big_12.jpg" alt="" /></p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/59.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>浏览器里的雷神之锤2(Quake II)</title>
		<link>http://www.benegg.com/game/archives/58.html</link>
		<comments>http://www.benegg.com/game/archives/58.html#comments</comments>
		<pubDate>Sat, 01 May 2010 04:00:39 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网游开发资讯]]></category>

		<category><![CDATA[Quake]]></category>

		<category><![CDATA[雷神之锤]]></category>

		<guid isPermaLink="false">http://www.benegg.com/game/archives/58.html</guid>
		<description><![CDATA[
我们知道, id Software 公司把它的著名的游戏"雷神之锤2(Quake II)"的 C 语言代码开源了. 之后, 很多的个人和公司开始修改这些代码, 发布基于 Quake 代码的产品. 而 Bytonic Software 公司把它移植到了 Java 下, 也就是用 Java 语言写了一个 Quake(Jake2 项目).
现在, 有一个开源的项目(Quake II GWT Port)把 Quake 搬到了浏览器上, 当然, 只有新的现代浏览器才支持, 如特定版本的 Google Chrome.

首先, 利用 Google Web Toolkit(GWT), 把 Java 版的 Quake 转成 JavaScript 代码在浏览器执行.
其次, 使用 WebGL 代替 OpenGL, DirectX 等接口的渲染方式.
原来的 UDP 通信也改成浏览器支持的 WebSocket API.

这个项目包含一个 [...]]]></description>
			<content:encoded><![CDATA[
			<p><a href="http://www.benegg.com/game/wp-content/uploads/2010/05/quake2-gwt-port.jpg"><img src="http://www.benegg.com/game/wp-content/uploads/2010/05/quake2-gwt-port-300x169.jpg" alt="" title="Quake2 GWT Port" width="300" height="169" class="alignright size-medium wp-image-57" /></a></p>
<p>我们知道, <a href="http://www.idsoftware.com/">id Software</a> 公司把它的著名的游戏"雷神之锤2(Quake II)"的 C 语言代码开源了. 之后, 很多的个人和公司开始修改这些代码, 发布基于 Quake 代码的产品. 而 Bytonic Software 公司把它移植到了 Java 下, 也就是用 Java 语言写了一个 Quake(Jake2 项目).</p>
<p>现在, 有一个开源的项目(<a href="http://code.google.com/p/quake2-gwt-port/">Quake II GWT Port</a>)把 Quake 搬到了浏览器上, 当然, 只有新的现代浏览器才支持, 如特定版本的 Google Chrome.</p>
<ol>
<li>首先, 利用 Google Web Toolkit(GWT), 把 Java 版的 Quake 转成 JavaScript 代码在浏览器执行.</li>
<li>其次, 使用 WebGL 代替 OpenGL, DirectX 等接口的渲染方式.</li>
<li>原来的 UDP 通信也改成浏览器支持的 WebSocket API.</li>
</ol>
<p>这个项目包含一个 Mac 和 Linux 下的服务器端. 浏览器可运行在 Mac, Linux, Windows 平台.</p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/58.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>从BT盗版下载中看2009年国外最流行的游戏</title>
		<link>http://www.benegg.com/game/archives/55.html</link>
		<comments>http://www.benegg.com/game/archives/55.html#comments</comments>
		<pubDate>Fri, 30 Apr 2010 15:18:46 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网游娱乐资讯]]></category>

		<category><![CDATA[使命召唤]]></category>

		<category><![CDATA[现代战争]]></category>

		<guid isPermaLink="false">http://www.benegg.com/game/archives/55.html</guid>
		<description><![CDATA[
从BT下载的统计来看, PC和Xbox 360平台上的"使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)"无疑是最大赢家. 而"新超级马里奥兄弟(New Super Mario Bros.)"则是处在Wii平台的榜首.
事实上, "现代战争2"在美国和英国市场上, 24小时之内就卖出了470万份拷贝. 然后, 5天内销售额就达到5亿5千万美元, 打破了之前的记录保持者"哈里-波特(Harry Potter)"和"混血王子(Half-Blood Prince)"(只有3亿9千4百万)和"黑暗骑士(The Dark Knight)"(只有2亿零3百80万).

2009年PC游戏BT下载

截止2009年12月27日


#
游戏
下载次数
发行时间




torrentfreak.com




1
使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)
(4,100,000)
2009年12月


2
模拟人生3(The Sims 3)
(3,200,000)
2009年06月


3
虐杀原形(Prototype)
(2,350,000)
2009年06月


4
极品飞车: 变速(Need For Speed Shift)
(2,100,000)
2009年09月


5
街头霸王4(Street Fighter IV)
(1,850,000)
2009年07月



2009年Xbox 360游戏BT下载

截止2009年12月27日


#
游戏
下载次数
发行时间




torrentfreak.com




1
使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)
(970,000)
2009年12月


2
街头霸王4(Street Fighter IV)
(840,000)
2009年07月


3
虐杀原形(Prototype)
(810,000)
2009年02月


4
尘埃2(Dirt 2)
(790,000)
2009年09月


5
终极格斗冠军赛2009(UFC 2009 Undisputed)
(720,000)
2009年03月



2009年Wii游戏BT下载

截止2009年12月27日


#
游戏
下载次数
发行时间




torrentfreak.com




1
新超级马里奥兄弟(New Super Mario Bros.)
(1,150,000)
2009年12月


2
拳无虚发!!(Punch-Out!!)
(950,000)
2009年05月


3
Wii休闲圣地(Wii Sports Resort)
(920,000)
2009年07月


4
死亡之屋: 赶尽杀绝(The House [...]]]></description>
			<content:encoded><![CDATA[
			<p><a href="http://www.benegg.com/game/wp-content/uploads/2010/05/call-of-duty-modern-warfare-2.jpg"><img src="http://www.benegg.com/game/wp-content/uploads/2010/05/call-of-duty-modern-warfare-2.jpg" alt="" title="使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)" width="199" height="185" class="alignright size-full wp-image-56" /></a></p>
<p>从BT下载的统计来看, PC和Xbox 360平台上的"使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)"无疑是最大赢家. 而"新超级马里奥兄弟(New Super Mario Bros.)"则是处在Wii平台的榜首.</p>
<p>事实上, "现代战争2"在美国和英国市场上, 24小时之内就卖出了470万份拷贝. 然后, 5天内销售额就达到5亿5千万美元, 打破了之前的记录保持者"哈里-波特(Harry Potter)"和"混血王子(Half-Blood Prince)"(只有3亿9千4百万)和"黑暗骑士(The Dark Knight)"(只有2亿零3百80万).</p>
<p><span id="more-55"></span><br />
<h4>2009年PC游戏BT下载</h4>
<table>
<caption>截止2009年12月27日</caption>
<thead>
<tr>
<th width="10%"><strong>#</strong></th>
<th width="50%"><strong>游戏</strong></th>
<th width="20%"><strong>下载次数</strong></th>
<th width="20%"><strong>发行时间</strong></th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="4">torrentfreak.com</td>
</tr>
</tfoot>
<tbody>
<tr>
<td><strong>1</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Call_of_Duty:_Modern_Warfare_2">使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)</a></td>
<td>(4,100,000)</td>
<td>2009年12月</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td><a href="http://en.wikipedia.org/wiki/The_Sims_3">模拟人生3(The Sims 3)</a></td>
<td>(3,200,000)</td>
<td>2009年06月</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Prototype_%28video_game%29">虐杀原形(Prototype)</a></td>
<td>(2,350,000)</td>
<td>2009年06月</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Need_for_Speed:_Shift">极品飞车: 变速(Need For Speed Shift)</a></td>
<td>(2,100,000)</td>
<td>2009年09月</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Street_Fighter_IV">街头霸王4(Street Fighter IV)</a></td>
<td>(1,850,000)</td>
<td>2009年07月</td>
</tr>
</tbody>
</table>
<h4>2009年Xbox 360游戏BT下载</h4>
<table>
<caption>截止2009年12月27日</caption>
<thead>
<tr>
<th width="10%"><strong>#</strong></th>
<th width="50%"><strong>游戏</strong></th>
<th width="20%"><strong>下载次数</strong></th>
<th width="20%"><strong>发行时间</strong></th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="4">torrentfreak.com</td>
</tr>
</tfoot>
<tbody>
<tr>
<td><strong>1</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Call_of_Duty:_Modern_Warfare_2">使命召唤: 现代战争2(Call of Duty: Modern Warfare 2)</a></td>
<td>(970,000)</td>
<td>2009年12月</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Street_Fighter_IV">街头霸王4(Street Fighter IV)</a></td>
<td>(840,000)</td>
<td>2009年07月</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Prototype_%28video_game%29">虐杀原形(Prototype)</a></td>
<td>(810,000)</td>
<td>2009年02月</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Colin_McRae:_Dirt_2">尘埃2(Dirt 2)</a></td>
<td>(790,000)</td>
<td>2009年09月</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td><a href="http://en.wikipedia.org/wiki/UFC_2009_Undisputed">终极格斗冠军赛2009(UFC 2009 Undisputed)</a></td>
<td>(720,000)</td>
<td>2009年03月</td>
</tr>
</tbody>
</table>
<h4>2009年Wii游戏BT下载</h4>
<table>
<caption>截止2009年12月27日</caption>
<thead>
<tr>
<th width="10%"><strong>#</strong></th>
<th width="50%"><strong>游戏</strong></th>
<th width="20%"><strong>下载次数</strong></th>
<th width="20%"><strong>发行时间</strong></th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="4">torrentfreak.com</td>
</tr>
</tfoot>
<tbody>
<tr>
<td><strong>1</strong></td>
<td><a href="http://en.wikipedia.org/wiki/New_Super_Mario_Bros._Wii">新超级马里奥兄弟(New Super Mario Bros.)</a></td>
<td>(1,150,000)</td>
<td>2009年12月</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Punch-Out!!_%28Wii%29">拳无虚发!!(Punch-Out!!)</a></td>
<td>(950,000)</td>
<td>2009年05月</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Wii_Sports_Resort">Wii休闲圣地(Wii Sports Resort)</a></td>
<td>(920,000)</td>
<td>2009年07月</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td><a href="http://en.wikipedia.org/wiki/The_House_of_the_Dead:_Overkill">死亡之屋: 赶尽杀绝(The House of the Dead: Overkill)</a></td>
<td>(860,000)</td>
<td>2009年02月</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Mario_Power_Tennis">马里奥网球(Mario Power Tennis)</a></td>
<td>(830,000)</td>
<td>2009年03月</td>
</tr>
</tbody>
</table>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/55.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Lighttpd的总体结构和防火墙模块开发</title>
		<link>http://www.benegg.com/game/archives/54.html</link>
		<comments>http://www.benegg.com/game/archives/54.html#comments</comments>
		<pubDate>Thu, 25 Mar 2010 05:44:01 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[Lighttpd源码分析]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=54</guid>
		<description><![CDATA[首先, 向各位订阅游戏开发博客(benegg.com)的朋友道歉, 4个月都没有发表新文章了.
最近, 想给Lighttpd做一个用来封IP的插件, 当然, 后期还会有其它功能, 比如连接限制, 防火墙等. 那么, 首先要明白Lighttpd的结构, 知道在哪里加入代码. 了解如下:

// network.c
handler_t network_server_handle_fdevent(void *s, void *context, int revents){
	con = connection_accept(srv, srv_socket);
	connection_state_machine(srv, con);
	plugins_call_handle_joblist(srv, con);
}

// server.c
main(){
	foreach(connection as con){
		connection_state_machine(srv, con);
		plugins_call_handle_joblist(srv, con);
	}
}

connection_state_machine 是其核心的连接处理函数, 可以忽略. 要实现的这个功能, 显然是用plugin(插件, 模块)来实现更好.
plugins_call_handle_joblist的定义是通过宏来定义的: PLUGIN_TO_SLOT(PLUGIN_FUNC_HANDLE_JOBLIST, handle_joblist), 如果直接查找这个函数, 你只能找到声明. 其实就是依次调用所有plugin的handle_joblist方法.
所以, 只需要实现了handle_joblist方法, 在这个方法中关闭指定的连接, 便达到了目的. 因为socket被accept之后会很快调用handle_joblist方法, 所以, 被关闭的连接只占用了非常少的资源.
我计划不是通过配置文件来配置白名单和黑名单, 而是提供一个网络接口, 接受指令对名单进行增删操作, 这样即时性和性能也更高. 当服务器出现异常连接时, 我们通过一个界面, 不断地把异常IP加入到黑名单中, 进行反击.
开发完插件(模块)后, 修改src/Makefile.am, 加入

lib_LTLIBRARIES += [...]]]></description>
			<content:encoded><![CDATA[
			<p>首先, 向各位订阅游戏开发博客(<a href="http://www.benegg.com">benegg.com</a>)的朋友道歉, 4个月都没有发表新文章了.</p>
<p>最近, 想给Lighttpd做一个用来封IP的插件, 当然, 后期还会有其它功能, 比如连接限制, 防火墙等. 那么, 首先要明白Lighttpd的结构, 知道在哪里加入代码. 了解如下:</p>
<pre>
// network.c
handler_t network_server_handle_fdevent(void *s, void *context, int revents){
	con = connection_accept(srv, srv_socket);
	connection_state_machine(srv, con);
	plugins_call_handle_joblist(srv, con);
}

// server.c
main(){
	foreach(connection as con){
		connection_state_machine(srv, con);
		plugins_call_handle_joblist(srv, con);
	}
}
</pre>
<p><span id="more-54"></span>connection_state_machine 是其核心的连接处理函数, 可以忽略. 要实现的这个功能, 显然是用plugin(插件, 模块)来实现更好.</p>
<p>plugins_call_handle_joblist的定义是通过宏来定义的: PLUGIN_TO_SLOT(PLUGIN_FUNC_HANDLE_JOBLIST, handle_joblist), 如果直接查找这个函数, 你只能找到声明. 其实就是依次调用所有plugin的handle_joblist方法.</p>
<p>所以, 只需要实现了handle_joblist方法, 在这个方法中关闭指定的连接, 便达到了目的. 因为socket被accept之后会很快调用handle_joblist方法, 所以, 被关闭的连接只占用了非常少的资源.</p>
<p>我计划不是通过配置文件来配置白名单和黑名单, 而是提供一个网络接口, 接受指令对名单进行增删操作, 这样即时性和性能也更高. 当服务器出现异常连接时, 我们通过一个界面, 不断地把异常IP加入到黑名单中, 进行反击.</p>
<p>开发完插件(模块)后, 修改src/Makefile.am, 加入</p>
<pre>
lib_LTLIBRARIES += mod_firewall.la
mod_firewall_la_SOURCES = mod_firewall.c
mod_firewall_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_firewall_la_LIBADD = $(common_libadd)
</pre>
<p>然后 ./configure --prefix=/path/to/</p>
<p>如果生成的src/Makefile不包含"firewall"字符串, 官方说明中的"autoreconf -fi"也可能没有用, 那就用文本编辑器把src/Makefile中的"rrdtool"替换为"firewall", 不用"rrdtool"也行, 找一个你不用的模块名字替换即可.</p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/54.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>谈谈网游开发</title>
		<link>http://www.benegg.com/game/archives/53.html</link>
		<comments>http://www.benegg.com/game/archives/53.html#comments</comments>
		<pubDate>Sun, 15 Nov 2009 04:19:16 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网络游戏引擎开发]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=53</guid>
		<description><![CDATA[在大概8到10年前, 2D的单机游戏盛行, 游戏重视的是可玩性. 那时候, 只要掌握了图像的移动, 再加一个好的创意, 几乎就能开发一款不错的游戏. 那些游戏, 瓶颈在于创意和计算机的速度.
而到了网络游戏, 特别是MMORPG, 需要的技术可就复杂多了, 甚至比Web开发所需要的技术还多得多了. 几乎从网络知识, 到操作系统, C语言, 脚本, 数据库, 3D等等. 但是, 现在的所谓的MMORPG引擎, 似乎就是图形引擎, 至少图形引擎的内容点整个"游戏引擎"的80%以上, 而在网络, 系统存储, 开发模式等非常少.
按我的理解, MMORPG开发的本质是实现一个超大规模的网络计算机. 这样想, 如果你有一个计算机, 网络带宽达到1T, 内存有1T, CPU能力相当于100个当下主流CPU, 那么, 我们就可以很容易实现一个能容纳10万人同时在线的"无缝世界"的网游. 因为, 这样的一个计算机, 你在内存中保存着对应客户端的"对象", 你可以非常快速地对这些对象进行创建, 查找, 更新, 删除操作, 以及网络接收和发送. 这就是所有的计算机应用的本质.
]]></description>
			<content:encoded><![CDATA[
			<p>在大概8到10年前, 2D的单机游戏盛行, 游戏重视的是可玩性. 那时候, 只要掌握了图像的移动, 再加一个好的创意, 几乎就能开发一款不错的游戏. 那些游戏, 瓶颈在于创意和计算机的速度.</p>
<p>而到了网络游戏, 特别是MMORPG, 需要的技术可就复杂多了, 甚至比Web开发所需要的技术还多得多了. 几乎从网络知识, 到操作系统, C语言, 脚本, 数据库, 3D等等. 但是, 现在的所谓的MMORPG引擎, 似乎就是图形引擎, 至少图形引擎的内容点整个"游戏引擎"的80%以上, 而在网络, 系统存储, 开发模式等非常少.</p>
<p>按我的理解, MMORPG开发的本质是实现一个超大规模的网络计算机. 这样想, 如果你有一个计算机, 网络带宽达到1T, 内存有1T, CPU能力相当于100个当下主流CPU, 那么, 我们就可以很容易实现一个能容纳10万人同时在线的"无缝世界"的网游. 因为, 这样的一个计算机, 你在内存中保存着对应客户端的"对象", 你可以非常快速地对这些对象进行创建, 查找, 更新, 删除操作, 以及网络接收和发送. 这就是所有的计算机应用的本质.</p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/53.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>由《地下城与勇士》的外挂制作者被拘说起</title>
		<link>http://www.benegg.com/game/archives/52.html</link>
		<comments>http://www.benegg.com/game/archives/52.html#comments</comments>
		<pubDate>Mon, 28 Sep 2009 11:52:07 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网游开发资讯]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=52</guid>
		<description><![CDATA[腾讯公司的《地下城与勇士》游戏同时在线人数据说达200万人. 对于这个数字我持保留意见. 但是, 一个名为萝卜游侠的外挂软件, 实现了该游戏的角色无敌, 秒杀怪物等作弊功能. 于是, 深圳南山区警方协同北京警方, 共同捣毁了该外挂的开发者 - 北京市萝卜科技有限公司, 并刑事拘留了多名犯罪嫌疑人, 其中大多是开发人员.
从这条消息, 我们可以看出两个重点.
1. 网游外挂开发竟然已经公司化和公开化了. 以合法注册的公司为掩护, 甚至制作的外挂也以公司名来命名, 这是很少见的. 从另一方面, 也佐证了网游外挂开发确实能产生即大的利益. 常常听到有某个大学生靠制作网游外挂, 每月也能收入过万.
2. 从技术上讲, 腾讯公司的《地下城与勇士》游戏被攻击的技术点可以说非常低级. 关键逻辑运算应该放在服务器端进行, 这是基本的常识, 而生命值, 魔法值, 攻击怪物的成功与否, 都应该由服务器来做最终裁决. 也许, 腾讯公司的技术人员基于性能或者某些考虑, 把这些判断放在客户端, 也许加密了, 但无论如何, 这种危险的做法都不应该再出现.
新闻链接: http://news.sina.com.cn/o/2009-09-28/040616369008s.shtml
]]></description>
			<content:encoded><![CDATA[
			<p>腾讯公司的《地下城与勇士》游戏同时在线人数据说达200万人. 对于这个数字我持保留意见. 但是, 一个名为萝卜游侠的外挂软件, 实现了该游戏的角色无敌, 秒杀怪物等作弊功能. 于是, 深圳南山区警方协同北京警方, 共同捣毁了该外挂的开发者 - 北京市萝卜科技有限公司, 并刑事拘留了多名犯罪嫌疑人, 其中大多是开发人员.</p>
<p>从这条消息, 我们可以看出两个重点.</p>
<p>1. 网游外挂开发竟然已经公司化和公开化了. 以合法注册的公司为掩护, 甚至制作的外挂也以公司名来命名, 这是很少见的. 从另一方面, 也佐证了网游外挂开发确实能产生即大的利益. 常常听到有某个大学生靠制作网游外挂, 每月也能收入过万.</p>
<p>2. 从技术上讲, 腾讯公司的《地下城与勇士》游戏被攻击的技术点可以说非常低级. 关键逻辑运算应该放在服务器端进行, 这是基本的常识, 而生命值, 魔法值, 攻击怪物的成功与否, 都应该由服务器来做最终裁决. 也许, 腾讯公司的技术人员基于性能或者某些考虑, 把这些判断放在客户端, 也许加密了, 但无论如何, 这种危险的做法都不应该再出现.</p>
<p>新闻链接: <a href="http://news.sina.com.cn/o/2009-09-28/040616369008s.shtml">http://news.sina.com.cn/o/2009-09-28/040616369008s.shtml</a></p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/52.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>用脚本语言开发网游 - C整合Python</title>
		<link>http://www.benegg.com/game/archives/51.html</link>
		<comments>http://www.benegg.com/game/archives/51.html#comments</comments>
		<pubDate>Fri, 11 Sep 2009 15:03:07 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[C语言编程]]></category>

		<category><![CDATA[网络游戏引擎开发]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=51</guid>
		<description><![CDATA[像因特网的Web系统一样, 几乎所有的大规模软件系统, 都会使用脚本语言. 在网络游戏服务器的开发中, 也会应用脚本语言. 游戏开发常用的脚本语言主要有: Python, Lua. 本文介绍在C语言中嵌入Python支持, C语言和Python语言通过API进行交互.
任何两种语言要整合, 首先要解决通信问题. C要和Python进行通信, 要进行数据结构转换, 把C的数据结构转为Python的对象, 和把Python对象转换为C数据结构.
下面对代码实例进行讲解, 代码忽略和错误处理.

#include &#60;python2.5/Python.h&#62;

void test1();
void test2();

PyObject *globals

int main(int argc, char **argv){
	PyObject *m, *obj1, *pobj;
	PyObject *request, *response;
	int i;

	Py_Initialize();

变量声明, 以及调用初始化函数 Py_Initialize().

	m = PyImport_AddModule("__main__");
	globals = PyModule_GetDict(m);

获取全局变量的字典表(哈希表). 在 Python 脚本中, 该字典表的键名就是全局变量的的名字. 例如, 全局变量字典表中有一项记录 'a' => '123', 那么, 在 Python 脚本中, 变量 a 的值是 '123'. 该字典表就是 C [...]]]></description>
			<content:encoded><![CDATA[
			<p>像因特网的Web系统一样, 几乎所有的大规模软件系统, 都会使用脚本语言. 在网络游戏服务器的开发中, 也会应用脚本语言. 游戏开发常用的脚本语言主要有: Python, Lua. 本文介绍在C语言中嵌入Python支持, C语言和Python语言通过API进行交互.</p>
<p>任何两种语言要整合, 首先要解决通信问题. C要和Python进行通信, 要进行数据结构转换, 把C的数据结构转为Python的对象, 和把Python对象转换为C数据结构.</p>
<p><span id="more-51"></span>下面对代码实例进行讲解, 代码忽略和错误处理.</p>
<pre>
#include &lt;python2.5/Python.h&gt;

void test1();
void test2();

PyObject *globals

int main(int argc, char **argv){
	PyObject *m, *obj1, *pobj;
	PyObject *request, *response;
	int i;

	Py_Initialize();
</pre>
<p>变量声明, 以及调用初始化函数 Py_Initialize().</p>
<pre>
	m = PyImport_AddModule("__main__");
	globals = PyModule_GetDict(m);
</pre>
<p>获取全局变量的字典表(哈希表). 在 Python 脚本中, 该字典表的键名就是全局变量的的名字. 例如, 全局变量字典表中有一项记录 'a' => '123', 那么, 在 Python 脚本中, 变量 a 的值是 '123'. 该字典表就是 C 语言和 Python 语言进行通信的关键.</p>
<pre>
	request = PyDict_New();
	response = PyDict_New();

	PyDict_SetItemString(globals, "request", request);
	PyDict_SetItemString(globals, "response", response);

	obj1 = PyInt_FromLong(1);
	PyDict_SetItemString(request, "count", obj1);
</pre>
<p>在本代码例子中, 字典表 request 用于 C 向 Python 传递数据, response 用于 Python 脚本向 C 程序传递数据. 使用两个字典并不是必须的, 可以只用一个. request 中有一项键名为 'count' 的记录, 相当于向 Python 传递了一个名为 'count' 的参数.</p>
<pre>
	/* <a href="http://www.benegg.com/">http://www.benegg.com</a> */
	for(i = 0; i &lt; 2; i++){
		test1();
		pobj = PyDict_GetItemString(response, "code");
		printf("code: %s\n", PyString_AsString(pobj));

		test2();
		pobj = PyDict_GetItemString(response, "code");
		printf("code: %s\n", PyString_AsString(pobj));

		printf("---\n");
	}
</pre>
<p>Python 脚本中返回名为 'code' 的响应参数, 在 C 程序中将该参数的值打印出来.</p>
<pre>
	Py_DECREF(obj1);
	Py_DECREF(request);
	Py_DECREF(response);

out:
	Py_Finalize();
	return 0;
}
</pre>
<p>使用宏 Py_DECREF 减少对象的引用计数, 以便 Python 进行垃圾收集. 最后调用 Py_Finalize() 释放资源.</p>
<pre>
void test1(){
	FILE *fp;
	fp = fopen("benegg.com.py", "r");
	PyRun_SimpleFile(fp, filename);
	fclose(fp);
}
</pre>
<p>PyRun_SimpleFile() 函数执行一个 Python 脚本文件.</p>
<pre>
void test2(){
	FILE *fp;
	PyObject *co;
	char *buf;
	long size;

	fp = fopen("benegg.com.py", "r");
	fseek(fp, 0, SEEK_END);
	size = ftell(fp);
	rewind(fp);

	buf = malloc(size + 1);
	fread(buf, 1, size, fp);
	buf[size] = '\0';

	PyRun_SimpleString(buf);
</pre>
<p>因为 PyRun_SimpleFile() 每执行一次都要读取一次文件, 所以可以把文件内容读取到字符缓冲中, 然后多次执行 PyRun_SimpleString(), 避免磁盘 IO 造成性能消耗.</p>
<pre>
	co = Py_CompileString(buf, "benegg.com", Py_file_input);
	PyEval_EvalCode((PyCodeObject *)co, globals, globals);
</pre>
<p>不过, 虽然 PyRun_SimpleString() 避免了磁盘 IO, 然后还是会在每一次执行的时候解析文本代码. 这时, 可以把代码编译成一个 PyCodeObject 对象, 然后调用 PyEval_EvalCode() 执行, 避免了多次解析造成的性能消耗.</p>
<pre>
	Py_DECREF(co);
out:
	free(buf);
	fclose(fp);
}
</pre>
<p>Python 脚本代码如下:</p>
<pre>
print "test1 - %d" % request['count']
request['count'] += 1
response['code'] = "test" + str(request['count'])
</pre>
<p>编译 C 代码:</p>
<pre>
# http://www.benegg.com
gcc -g -Wall -o c test.c -L/usr/lib/python2.5/config -lpython2.5
</pre>
<p>注意, 将路径改为你机器上的实际路径. 执行 ./c, 可以看到, 执行的结果是:</p>
<pre>
test1 - 1
code: test2
test1 - 2
test1 - 3
code: test4
---
test1 - 4
code: test5
test1 - 5
test1 - 6
code: test7
</pre>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/51.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>类Python语法的C/C++配置文件库</title>
		<link>http://www.benegg.com/game/archives/50.html</link>
		<comments>http://www.benegg.com/game/archives/50.html#comments</comments>
		<pubDate>Thu, 10 Sep 2009 14:09:50 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[C语言编程]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=50</guid>
		<description><![CDATA[几乎完整的程序或者软件, 都有配置信息, 一般保存在文件中. C/C++ 语言的项目一般使用 .ini 文件作为配置文件. ini 文件和成熟的库供使用, 但缺点很明显, 很难表达父子关系, 因为配置信息应该是一根树 - 配置树.
著名的Web Server Lighttpd 使用 LEMON 来解析配置文件. 有些软件还使用 Lua/Python 等脚本语言来做配置管理. 但很多时候没有这个必要. 配置信息只要是一根树即可.
基于这个考虑, 我开发了 C/C++ 的配置管理库, 可用来做程序/软件的配置模块.


语法定义:

空白字符为 '\t \r\n'(制表符, 空格, 回车, 换行)
忽略只包含空白字符的行
有效行以 '\t*' 开头
注释行以 '\t*#' 开头
有效行如果不是注释, 则必须是键值对配置行. key 和 value 之间用等号'='或者冒号':'分隔
key 不包含任何空白字符, 两端的空白字符被忽略
value 两端的空白字符被忽略
配置项可以有包含关系, 用一个 TAB 缩进表示父子关系



配置读取:

用键名获取子配置项
用斜杠'/'或者句号'.'分隔的配置项路径获取配置项
把配置项的值作为整形(int)返回
把配置项的值作为字符串(char *)返回



配置文件示例:

# this is a comment

author : ideawu
	url: [...]]]></description>
			<content:encoded><![CDATA[
			<p>几乎完整的程序或者软件, 都有配置信息, 一般保存在文件中. C/C++ 语言的项目一般使用 .ini 文件作为配置文件. ini 文件和成熟的库供使用, 但缺点很明显, 很难表达父子关系, 因为配置信息应该是一根树 - 配置树.</p>
<p>著名的Web Server Lighttpd 使用 LEMON 来解析配置文件. 有些软件还使用 Lua/Python 等脚本语言来做配置管理. 但很多时候没有这个必要. 配置信息只要是一根树即可.</p>
<p>基于这个考虑, 我开发了 C/C++ 的配置管理库, 可用来做程序/软件的配置模块.</p>
<ul>
<li>
<h3>语法定义:</h3>
<ul style="margin-bottom: 10px;">
<li>空白字符为 '\t \r\n'(制表符, 空格, 回车, 换行)</li>
<li>忽略只包含空白字符的行</li>
<li>有效行以 '\t*' 开头</li>
<li>注释行以 '\t*#' 开头</li>
<li>有效行如果不是注释, 则必须是键值对配置行. key 和 value 之间用等号'='或者冒号':'分隔</li>
<li>key 不包含任何空白字符, 两端的空白字符被忽略</li>
<li>value 两端的空白字符被忽略</li>
<li>配置项可以有包含关系, 用一个 TAB 缩进表示父子关系</li>
</ul>
</li>
<li>
<h3>配置读取:</h3>
<ul style="margin-bottom: 10px;">
<li>用键名获取子配置项</li>
<li>用斜杠'/'或者句号'.'分隔的配置项路径获取配置项</li>
<li>把配置项的值作为整形(int)返回</li>
<li>把配置项的值作为字符串(char *)返回</li>
</ul>
</li>
</ul>
<p>配置文件示例:</p>
<pre>
# this is a comment

author : ideawu
	url: http://www.ideawu.net

proxy :
	php =
		host = 127.0.0.1
		port = 8088
	py :
		host = 127.0.0.1
		port = 8080

cgi =
	pl = /usr/bin/perl
</pre>
<p>C代码示例见: <a href="http://www.ideawu.net/person/config/">http://www.ideawu.net/person/config/</a></p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/50.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>C语言与Python, Lua, PHP等语言的接口</title>
		<link>http://www.benegg.com/game/archives/49.html</link>
		<comments>http://www.benegg.com/game/archives/49.html#comments</comments>
		<pubDate>Sat, 29 Aug 2009 14:33:37 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网络编程]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=49</guid>
		<description><![CDATA[在网络游戏等网络系统的开发中, 一般用多种语言配合开发. 用C来开发通信, 高密度运算等基础功能, 由脚本语言或者Java, C#等更高级的语言进行业务处理. 在这种架构方面, Web系统是最广泛, 功能最强大的一个应用. 整个因特网可以说是建立在脚本之上, 虽然Web服务器, 数据库大多是用C开发的.
C语言和脚本语言(本文中包括Java等所有高级语言)的通信有两个层次: 1, 编程语言接口(API); 2, 进程间通信(IPC).
编程语言接口的方式, 可以看作是线程单(进程内)通信, 在某些方面速度较快. 但是接口多样, 各种语言都不相同, 造成不必要的复杂度.
进程间通信包括网络通信(Socket), 本地通信(如管道). 使用本种方式, C语言与脚本语言是单一接口, 而且统一.
Web服务器可能包括两种通信方式, 如Apache可以通过fastcgi和PHP进行Socket通信, 也可以通过mod_php使用API与PHP进行通信.
]]></description>
			<content:encoded><![CDATA[
			<p>在网络游戏等网络系统的开发中, 一般用多种语言配合开发. 用C来开发通信, 高密度运算等基础功能, 由脚本语言或者Java, C#等更高级的语言进行业务处理. 在这种架构方面, Web系统是最广泛, 功能最强大的一个应用. 整个因特网可以说是建立在脚本之上, 虽然Web服务器, 数据库大多是用C开发的.</p>
<p>C语言和脚本语言(本文中包括Java等所有高级语言)的通信有两个层次: 1, 编程语言接口(API); 2, 进程间通信(IPC).</p>
<p>编程语言接口的方式, 可以看作是线程单(进程内)通信, 在某些方面速度较快. 但是接口多样, 各种语言都不相同, 造成不必要的复杂度.</p>
<p>进程间通信包括网络通信(Socket), 本地通信(如管道). 使用本种方式, C语言与脚本语言是单一接口, 而且统一.</p>
<p>Web服务器可能包括两种通信方式, 如Apache可以通过fastcgi和PHP进行Socket通信, 也可以通过mod_php使用API与PHP进行通信.</p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/49.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>遭遇SIGPIPE</title>
		<link>http://www.benegg.com/game/archives/48.html</link>
		<comments>http://www.benegg.com/game/archives/48.html#comments</comments>
		<pubDate>Thu, 20 Aug 2009 16:36:50 +0000</pubDate>
		<dc:creator>benegg</dc:creator>
		
		<category><![CDATA[网络编程]]></category>

		<guid isPermaLink="false">http://www.benegg.com/?p=48</guid>
		<description><![CDATA[用TCP的"四次握手"关闭解释SIGPIPE信号.
原文: http://www.ideawu.net/blog/?p=413
]]></description>
			<content:encoded><![CDATA[
			<p>用TCP的"四次握手"关闭解释SIGPIPE信号.</p>
<p>原文: <a href="http://www.ideawu.net/blog/?p=413">http://www.ideawu.net/blog/?p=413</a></p>
		]]></content:encoded>
			<wfw:commentRss>http://www.benegg.com/game/archives/48.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
