﻿id	summary	reporter	owner	description	type	status	milestone	component	version	severity	resolution	keywords	cc
2835	Change the TCP*() funktions to optional use non blocking ports.	rthilo		"Hello.

The timeouts of the TCP*() functions doesn't seem to have effect. Some kind fellow from a different forum explained to me, that's most propably due to the use of *BLOCKING* ports by these functions. He wrote this EXE for me, I use it with fileinstall() in case I need to check lot's of IP:PORT status.

Suggestion: Modify the network functions of Autoit, so that they (at least optional) also use non blocking ports, so that short timeouts can be reality.


the ChkPort.PAS example code that fellow wrote for me is this:

[code]
program chkPort;
// Input: chkport-ip <ip address> <port> [timeout]
// Output: Text message + Errorlevel
// 0 if we connect,
// 1 if we timeout,
// 2 if we get a socket failure,
// 3 for an invalid address.

uses sockets,inetaux,strutils,winsock2,sysutils;
var
ConSock : LongInt;
sAddr : TInetSockAddr;
timeout : dword;
result : boolean;

procedure setnonblockingsocket( s : integer );
var
nb : dword;
begin
nb := 1; // 1 = nonblocking, 0 = blocking
winsock2.ioctlsocket( s , FIONBIO , @nb );
end;

function is_writable_socket( sck : integer; timeout : dword ) : boolean;
var
fds : tfdset;
tv : timeval;
result : boolean;
begin
fd_zero( fds );
fd_set( sck , fds );
tv.tv_sec := timeout div 1000;
tv.tv_usec := timeout mod 1000;

// select (socket+1 , read , write , except , timeout) - wait
// ""timeout"" to see if data can be written to ""socket"" without
// blocking

result := select( sck + 1 , nil , @fds , nil , @tv ) > 0;
is_writable_socket := result;
end;

begin
// create a socket, die if we fail
ConSock := Socket(af_inet, sock_stream, 0);
if ConSock = -1 then begin
writeln('Could not open socket: ');
halt(2);
end
else begin

// make it non-blocking
SetNonBlockingSocket(ConSock);

// if timeout defined use it, otherwise default to 2 secs
If paramcount >= 3 then Timeout := numb2dec(paramstr(3),10)
else timeout := 2000;

// fill in the socket info - protocol, address, port
with sAddr do begin
Family := af_inet;
Port := htons(numb2dec(paramstr(2),10));
Addr := StrToAddr(paramstr(1));
end;

// die if we can't turn the address into something useable
If saddr.Addr = 0 then begin
writeln('Could not resolve ',paramstr(1));
halt(3);
end;

// otherwise try to connect
Result := (fpConnect(ConSock, @sAddr, sizeof(sAddr)) = 0);

// and see if it become writeable in the time allowed
result := result or is_writable_socket(consock, timeout);

// close the socket
Shutdown(ConSock, 2);

// and report results
If result then writeln('Port listening')
else begin
Writeln('Port not listening');
halt(1);
end;
end;
end.
[/code]

the compiled EXE is available from my dropbox here:

https://dl.dropboxusercontent.com/u/19989673/ChkPort-IP/chkport.exe

Hoping to have explained it correctly, thanks for Autoit!

Regards, Rudi."	Feature Request	closed		AutoIt		None	Completed	network non blocking ports timeout	
