首先请看flash XMLSocket的原文自述:
但是,unrealircd(包括其它ircd)的消息都是遵循IRC协议以\r\n来尾的,如果ircd不做任何改动的话,XMLSocket是不会收到ircd传递过来的信息,同时XMLSocket发出的命令IRC也不可能正确的进行解析与执行。
如果你想让unrealircd能与XMLSocket协同工作,请按以下步聚操作:
一,修改unrealircd源码,让其可以正确解析XMLSocket发出的命令:
找到源文件packet.c,如下代码片,约在118行左右,并根据提示进行修改:
二,修改unrealircd源码,让其消息可以被XMLSocket正确接收:
找到socket.c源文件,根据如下提示操作:
1,约92行左右,找到如下行:
然后对其重新编译,现在,你的ircd已经可以支持flash XMLSocket了。你可以写一个flash的测试端来进行测试了,请看我随后的文章里的介绍:用flash测试你的ircd。
每个 XML 消息都是一个完整的 XML 文档,以一个零 (0) 字节结束。
当某个消息已从服务器下载并以零 (0) 字节结束时调用。您可以覆盖 XMLSocket.onData 以截获服务器发送的数据,而不将其分析为 XML。如果您传输的是任意格式的数据包,而且希望在数据到达时直接操纵这些数据,而不让 Flash Player 将数据分析为 XML,则此方法很有用。
默认情况下,XMLSocket.onData 方法调用 XMLSocket.onXML 方法。如果您用自定义行为覆盖 XMLSocket.onData,除非您在 XMLSocket.onData 实现过程中调用 XMLSocket.onXML,否则不会对其进行调用。
默认情况下,XMLSocket是将数据组织成XML标准格式进行处理的,并且消息以零字节结束。
默认情况下,XMLSocket.onData 方法调用 XMLSocket.onXML 方法。如果您用自定义行为覆盖 XMLSocket.onData,除非您在 XMLSocket.onData 实现过程中调用 XMLSocket.onXML,否则不会对其进行调用。
但是,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' || g == ' \n ' || g == ' \r ' )) //注意:红色粗体部分是所做的改动
{
if (ch1 == cptr->buffer)
continue; /* Skip extra LF/CR's */
*ch1 = '\0';
}
* 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' || g == ' \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 " , 1 , 0 );
}
str[len] = ' \0 ' ;
retval = send(cptr -> fd, str, len, 0 );
send(cptr -> fd, " \0 " , 1 , 0 );
}
然后对其重新编译,现在,你的ircd已经可以支持flash XMLSocket了。你可以写一个flash的测试端来进行测试了,请看我随后的文章里的介绍:用flash测试你的ircd。
提示:这样修改后,对于正常的IRC客户端软件连接又会带来一定的问题,以致于有些消息不能被正常解析,如mirc等,最好的办法是扩展IRC协议并修改ircd源码,让其能根据不同的客户端类型发送不同的消息格式,随后在我应用到时,我再写文章来详细如何改造。
本文转自 OldHawk 博客园博客,原文链接:http://www.cnblogs.com/taobataoma/archive/2006/11/21/567373.html,如需转载请自行联系原作者