OldHawk

菜地一块,欢迎拍砖
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

修改ircd源码,以让其适应flash XMLSocket连接

Posted on 2006-11-21 15:02  OldHawk  阅读(859)  评论(1编辑  收藏  举报
  首先请看flash XMLSocket的原文自述:
每个 XML 消息都是一个完整的 XML 文档,以一个零 (0) 字节结束。

当某个消息已从服务器下载并以零 (0) 字节结束时调用。您可以覆盖 XMLSocket.onData 以截获服务器发送的数据,而不将其分析为 XML。如果您传输的是任意格式的数据包,而且希望在数据到达时直接操纵这些数据,而不让 Flash Player 将数据分析为 XML,则此方法很有用。

默认情况下,XMLSocket.onData 方法调用 XMLSocket.onXML 方法。如果您用自定义行为覆盖 XMLSocket.onData,除非您在 XMLSocket.onData 实现过程中调用 XMLSocket.onXML,否则不会对其进行调用。
  默认情况下,XMLSocket是将数据组织成XML标准格式进行处理的,并且消息以零字节结束。

  但是,unrealircd(包括其它ircd)的消息都是遵循IRC协议以\r\n来尾的,如果ircd不做任何改动的话,XMLSocket是不会收到ircd传递过来的信息,同时XMLSocket发出的命令IRC也不可能正确的进行解析与执行。

  如果你想让unrealircd能与XMLSocket协同工作,请按以下步聚操作:

  一,修改unrealircd源码,让其可以正确解析XMLSocket发出的命令:
    找到源文件packet.c,如下代码片,约在118行左右,并根据提示进行修改:
/*
* Yuck.  Stuck.  To make sure we stay backward compatible,
* we must assume that either CR or LF terminates the message
* and not CR-LF.  By allowing CR or LF (alone) into the body
* of messages, backward compatibility is lost and major
* problems will arise. - Avalon
*/

if (g < '\16' && (g == '\0' ||== '\n' || g == '\r'))   //注意:红色粗体部分是所做的改动
{
    
if (ch1 == cptr->buffer)
        
continue;    /* Skip extra LF/CR's */
    
*ch1 = '\0';
    
}

  
  二,修改unrealircd源码,让其消息可以被XMLSocket正确接收:
    找到socket.c源文件,根据如下提示操作:
    1,约92行左右,找到如下行:
retval = send(cptr->fd, str, len, 0);
    2,修改为如下代码:
{    
    str[len]
='\0';
    retval 
= send(cptr->fd, str, len, 0);
    send(cptr
->fd, "\0"10);
}


  然后对其重新编译,现在,你的ircd已经可以支持flash XMLSocket了。你可以写一个flash的测试端来进行测试了,请看我随后的文章里的介绍:用flash测试你的ircd。

  提示:这样修改后,对于正常的IRC客户端软件连接又会带来一定的问题,以致于有些消息不能被正常解析,如mirc等,最好的办法是扩展IRC协议并修改ircd源码,让其能根据不同的客户端类型发送不同的消息格式,随后在我应用到时,我再写文章来详细如何改造。