12 2011 档案

摘要:由于最近在看UDP打洞,本着力求精简,不用三方控件的原则下,折腾了Sockets.pas这个单元。在弄清如何用Sockets单元中类执行udp server的功能时,发现了一个小BUG。BUG描述: 无法判断UDP数据包是谁发来的。这个BUG存在于TIpSocket类的ReceiveFrom方法中,功能是从当前的Socket中接收数据包,并可以返回对方的TSockAddr,在UDP接收中,这个很重要,因为UDP需要知道数据包是从哪里发送来的。 此函数的实现为:function TIpSocket.ReceiveFrom(var buf; bufsize: Integer; ToAddr... 阅读全文
posted @ 2011-12-21 16:35 littlestone08 阅读(925) 评论(1) 推荐(0)
摘要:在不同的DELHI版本中,INDY的版本是不同的,而且9和10不兼容,为了让代码简单,轻便,跨版本移值,决定udp使用时使用TUdpSocket控件来实现收发。结果却令人郁闷的发现,无法接收,因为TUdpSocket是为作Client设置的,没有进行Bind,于是,显式调用了Bind,依然不行,返回一个错误码。查看netstat ,显示的是一个随机的端口。 由于对WINSOCK底层不是很了解,看源码时没有发现什么问题。结果在CSDN上有人指出了问题所在,TUdpSocket在Open时会调用Connect,而Connect时会bind到一个随机的端口,所以再次bind时会失败。 原来如... 阅读全文
posted @ 2011-12-21 11:32 littlestone08 阅读(1053) 评论(0) 推荐(0)
摘要:UDT是用UDP实现,以可靠传输为目标的一套开源库,其源码可以在SF上找到,直到现在不久,才发现是它是国人的一个开源软件,向研究此协议的谷博士致敬,在当前的浮燥环境,尤其可敬。 网上有SDK作者本人写的一个DELPHI的UDT.pas的头文件,本来想用它来封装一个类似TTcpServer和TTcpClient的组件,但半途中发现udt的select函数的参数是C++中的Vector类型,这在Delphi中没有,而UDT.pas中也没有相关的定义。于是自己动手,丰衣足食,自己下载下来代码,手动重新导出已有的函数,新加并导出必要的函数。 关于编译SDK 对C++不熟悉,虽然网上有相关的讨... 阅读全文
posted @ 2011-12-17 16:56 littlestone08 阅读(3192) 评论(25) 推荐(0)
摘要:一般情况下,我们并不需要替换VCL的代码,但是,如果有某些特别的目的需要更改VCL中默认的执行逻辑的话,下面的东西应该有用。另一种方法是用Inject,但是,如果是你自己的程序,且有源码,用下面的办法就会省事的多了Procedure PatchVCLCode(ProcOld, ProcNew: Pointer);var newCode : packed record JmpRel32 : Byte; Offset32 : Integer; end;begin newCode.JmpRel32 := $E9; newCode.Offset32 := Integer(p... 阅读全文
posted @ 2011-12-01 10:18 littlestone08 阅读(378) 评论(0) 推荐(0)