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;