一刀兄:
不知道这个问题是不是和硬件环境有关。
我同事说他在一台笔记本上测试的时候,如果用一个跟本机不在同一网段的IP,则返回地挺快。
但在我的机器上不管用什么样的IP结果都一样,而且反而是用HOST的返回要快一些。
我再把问题说详细些——
程序设置:
我在scktcomp.pas的源码中如下的几个地方利用GetTickCount把运行时间显示在主界面上:
TCustomWinSocket.DoOpen过程中的CheckSocketResult(WinSock.connect(...之前
CheckSocketResult过程中的raise ESocketError.CreateResFmt(...之前
——以上两处是针对用IP的情况;
TCustomWinSocket.LookupName过程中的HostEnt := gethostbyname(PChar(Name));前后
——以上两处针对用HOST的情况;
主程序里调用SocketConnection1.Connected := True;之前以及它的except处理语句中
——记录连接初始时间和返回时间。
运行环境:
PⅢ 800、128M RAM、中文WIN98第二版,启动$(DELPHI)/Bin/scktsrvr.exe;
SocketConnect的Port为211、ServerGUID和ServerName属性均设为正确值。
运行结果:
用错误的IP——走到connect之前用时3毫秒;到connect出错用时45秒;再用2毫秒回到主程序。
用错误的HOST——走到gethostbyname之前用时2毫秒;之后用时11秒;再用3毫秒回到主程序。
——其中的时间都是大概的情况。
正如Infernal Goddess所说,通过对源码的跟踪也没有看到直接的解决办法
API里是不是只有setsockopt可以控制超时?
但是帮助里对setsockopt又有这么一个说明——
BSD options not supported for setsockopt are: ...SO_SNDTIMEO...
试了一下——
在sconnect.pas的TSocketTransport.SetConnected过程中的FClientSocket.Open;之前加上:
nTimeOut := 1000;
nLen := SizeOf(Integer);
if setsockopt(FSocket.SocketHandle, SOL_SOCKET, SO_SNDTIMEO, PChar(@nTimeOut), nLen) <> 0 then
...
——结果确实总是调用失败。
不知有没有办法解决这个问题……