Delphi的Indy ICMP封装在DLL之后 PING一个不存在的主机时程序会崩溃

Delphi的Indy ICMP封装在DLL之后 PING一个不存在的主机时程序会崩溃,第1张

1、Indy是个很垃圾的玩意,这个错误是Indy控件本身的问题,你自身无法解决,除非自己写API或调用OCX控件。

2、你的函数本身也有问题,Dll里的字符串不能这样传递。你看看Windows的API函数就知道,没有一个是以PChar为返回值的(字符串函数除外)。你这个程序能正常运行,真是奇迹。

3、下面这个函数是我给你改的,sURL是地址;Buffer是一个缓冲区,用来接收IP地址;BufferLength是缓冲区长度,当Buffer为 nil 时它返回需要的空间大小;函数返回值为IP地址的长度。

function getIPAddress(sURL, Buffer: PCharvar BufferLength: Longint): Longintstdcall

var

ICMP: TIdIcmpClient

R: TReplyStatus

s: string

begin

Result := 0

ICMP := TIdIcmpClient.Create(nil)

ICMP.ReceiveTimeout := 1000

ICMP.Host := sURL

ICMP.Ping

R := ICMP.ReplyStatus

s := Format('%d,', [R.MsRoundTripTime]) + R.FromIpAddress

if Buffer = nil then

BufferLength := Length(s) + 1

else begin

StrLCopy(Buffer, PChar(s), BufferLength - 1)

Result := StrLen(Buffer)

end

ICMP.free

end

4、在主程序中,这个函数这样调用

var

len: Longint

buf: PChar

begin

getIPAddress(sURL, nil, len)

GetMem(buf, len)

getIPAddress(sURL, buf, len)

ShowMessage(buf)

FreeMem(buf)

end

1、Windows+R,然后在运行中输入cmd,点击确定。

2、进入CMD页面,先输入ipconfig ,然后回车看看。

3、回车后找到默认网关,本机的IP地址。

4、然后输入ping 192.168.10.1 -t  再回车,-t就是一直ping下去。

5、Ctrl+C是终止它继续ping下去,主要看两个地方,一是有没有丢包,二是有没有延时。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12042631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存