DFW上没人能回答出来
贴这里大家看看,帮帮忙,谢谢。TcpConnection,这个在连接不通的情况下要延时20多秒(另外一个TcpConnection2就是对此改进:可以自定义延时时间,但是我在多线程里面调用这个改进后的TcpConnection2,得出的结果却没有TcpConnection准确,
下列測試代碼説明了問題所在:
假設 從192.168.1.1到192.168.1.235 中只有 192.168.1.235:86是能連接通的 ,for i := 100 to 235 do 這個循環 執行后的結果 j为0
但若使用for i := 235 downto 100 do這個循環的話,结果是为1;
意味著這個改進后的函數只能在有限的次數下有效。
這可怎麽辦?
for i := 100 to 235 do
// for i := 235 downto 100 do
begin
k := TcpConnection2('192.168.253.'+IntToStr(i),86,1);
j := j + k;
end; function TcpConnection(_Host:String;_Port:Integer):integer;
var i:integer;
sin:sockaddr_in;
mint :integer ;
begin
sin.sin_family:=AF_INET;
sin.sin_port:=htons(_Port);
i:=inet_addr(PChar(_Host));
sin.sin_addr.S_addr:=i;
mint := 0;
try
mint := socket(PF_INET,SOCK_STREAM,0);
if Connect(mint,sin,sizeof(sin))=SOCKET_ERROR then
//上面這句在不能連通的情況下要延遲20秒之多,因此另外改進為下一個TCPConnection2
Result := 0
else
Result :=1 ;
finally
CloseSocket(mint);
end;
end;
//-----------------改進后的TcpConnection2---------------
function TcpConnection2(_Host:String;_Port:Integer;_TimeOut: integer):integer;
var i:integer;
sin:sockaddr_in;
mint :integer ;
fs: TFDSet;
timeout: timeval;
ulb: integer;
RC:integer;
begin
RC := 0;
sin.sin_family:=AF_INET;
sin.sin_port:=htons(_Port);
i:=inet_addr(PChar(_Host));
sin.sin_addr.S_addr:=i;
mint := 0;
FD_ZERO(fs);
try
mint := socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
FD_SET(mint,fs);
timeout.tv_sec := _TimeOut;//连接超时
//延时_TimeOut 為 10秒
timeout.tv_usec := 500;
ulb := 1;
ioctlsocket(mint,FIONBIO,ulb);
if Connect(mint,sin,sizeof(sin))=SOCKET_ERROR then
begin//
if (WSAGetLastError() = WSAEWOULDBLOCK) then
begin
FD_ZERO(fs);
FD_SET(mint,fs);
RC := select(0,nil,@fs,nil,@TimeOut);
end;
if RC = 0 then
Result := 0
else
Result := 1;
end// 返回的Result 有问题???????
else
Result := 1;
finally
ulb := 0;
ioctlsocket(mint,FIONBIO,ulb);
CloseSocket(mint);
end;
end;
贴这里大家看看,帮帮忙,谢谢。TcpConnection,这个在连接不通的情况下要延时20多秒(另外一个TcpConnection2就是对此改进:可以自定义延时时间,但是我在多线程里面调用这个改进后的TcpConnection2,得出的结果却没有TcpConnection准确,
下列測試代碼説明了問題所在:
假設 從192.168.1.1到192.168.1.235 中只有 192.168.1.235:86是能連接通的 ,for i := 100 to 235 do 這個循環 執行后的結果 j为0
但若使用for i := 235 downto 100 do這個循環的話,结果是为1;
意味著這個改進后的函數只能在有限的次數下有效。
這可怎麽辦?
for i := 100 to 235 do
// for i := 235 downto 100 do
begin
k := TcpConnection2('192.168.253.'+IntToStr(i),86,1);
j := j + k;
end; function TcpConnection(_Host:String;_Port:Integer):integer;
var i:integer;
sin:sockaddr_in;
mint :integer ;
begin
sin.sin_family:=AF_INET;
sin.sin_port:=htons(_Port);
i:=inet_addr(PChar(_Host));
sin.sin_addr.S_addr:=i;
mint := 0;
try
mint := socket(PF_INET,SOCK_STREAM,0);
if Connect(mint,sin,sizeof(sin))=SOCKET_ERROR then
//上面這句在不能連通的情況下要延遲20秒之多,因此另外改進為下一個TCPConnection2
Result := 0
else
Result :=1 ;
finally
CloseSocket(mint);
end;
end;
//-----------------改進后的TcpConnection2---------------
function TcpConnection2(_Host:String;_Port:Integer;_TimeOut: integer):integer;
var i:integer;
sin:sockaddr_in;
mint :integer ;
fs: TFDSet;
timeout: timeval;
ulb: integer;
RC:integer;
begin
RC := 0;
sin.sin_family:=AF_INET;
sin.sin_port:=htons(_Port);
i:=inet_addr(PChar(_Host));
sin.sin_addr.S_addr:=i;
mint := 0;
FD_ZERO(fs);
try
mint := socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
FD_SET(mint,fs);
timeout.tv_sec := _TimeOut;//连接超时
//延时_TimeOut 為 10秒
timeout.tv_usec := 500;
ulb := 1;
ioctlsocket(mint,FIONBIO,ulb);
if Connect(mint,sin,sizeof(sin))=SOCKET_ERROR then
begin//
if (WSAGetLastError() = WSAEWOULDBLOCK) then
begin
FD_ZERO(fs);
FD_SET(mint,fs);
RC := select(0,nil,@fs,nil,@TimeOut);
end;
if RC = 0 then
Result := 0
else
Result := 1;
end// 返回的Result 有问题???????
else
Result := 1;
finally
ulb := 0;
ioctlsocket(mint,FIONBIO,ulb);
CloseSocket(mint);
end;
end;
解决方案 »
- 动态加载DLL 为什么我这样报错?
- 转帖:DELPHI用const来提高应用程序在多核多线程下的性能
- bde可以用分页技术吗?
- 我要使DBGrid中显示的记录以某一个字段ID升序排列,怎么设置?而且在添加一行的时候,这个字段自动加1,不用人工输入呢?
- label背景透明怎样设置
- 数据导入Excel2000时遇到的问题。急!
- Tree控件的点击后节点自动扩张,收缩的的消息是啥??? 还有我想让Tree在mouseDown后每次把VScrollBar在最顶上,如何做
- 请问那里有gifimage控件下载
- 腾讯和魔装网神中把自己设为默认的浏览器是如何做的啊,改注册表在什么地方呢
- 用ADO对一个多表的数据库进行操作时是否需要2个ADOQuery?
- 关于文件类型关联的问题
- 如何在dbGrid中保存查询出的结果??
意味著這個改進后的函數只能在有限的次數下有效。说明不了问题啊,我估计这个函数是没问题的,
至于为什么是1, 可能刚好那部被连接的机器出问题