经验分享1: connect 、recv、send 超时解决方案 ( 积分: 0 )

  • 主题发起人 主题发起人 leaber
  • 开始时间 开始时间
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3102533

TcpConnection 在不能連通的情況下要延遲20秒之多,因此另外改進為下一個TCPConnection2

50個綫程連續調用 TcpConnection 掃描不同的ip(從192.168.1.1到192.168.1.255升序地時候,192.168.1.255:86 的結果是錯誤的,而反过来降序: 從192.168.1.255到192.168.1.1 扫描的結果是正確的,意味着,开始扫描的结果是正确的,越靠后越不对。
192.168.1.255:86是可以連接上的,從 192.168.1.1開始掃描到1.255的時候就不行了,暈阿

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
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;
 
后退
顶部