<div dir="ltr">see also:<div><a href="https://github.com/rejectedsoftware/vibe.d/issues/1431">https://github.com/rejectedsoftware/vibe.d/issues/1431</a> api to find an available port<br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 18, 2016 at 2:50 AM, Marc Schütz via Digitalmars-d-learn <span dir="ltr"><<a href="mailto:digitalmars-d-learn@puremagic.com" target="_blank">digitalmars-d-learn@puremagic.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Looking at an strace of nmap, it seems it opens a bunch of sockets, puts them into non-blocking mode, calls connect on them (which will return EINPROGRESS), and then uses select(2) to wait for them (in a loop, until all have either been accepted or rejected). select(2) accepts a timeout value, so you can determine how long you want to wait.<br>
<br>
Here's an excerpt:<br>
<br>
...<br>
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 50<br>
fcntl(50, F_GETFL)                      = 0x2 (flags O_RDWR)<br>
fcntl(50, F_SETFL, O_RDWR|O_NONBLOCK)   = 0<br>
setsockopt(50, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0<br>
setsockopt(50, SOL_SOCKET, SO_BINDTODEVICE, [0], 4) = -1 EPERM (Operation not permitted)<br>
setsockopt(50, SOL_IP, IP_TTL, [-1], 4) = 0<br>
connect(50, {sa_family=AF_INET, sin_port=htons(32778), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)<br>
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 51<br>
fcntl(51, F_GETFL)                      = 0x2 (flags O_RDWR)<br>
fcntl(51, F_SETFL, O_RDWR|O_NONBLOCK)   = 0<br>
setsockopt(51, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0<br>
setsockopt(51, SOL_SOCKET, SO_BINDTODEVICE, [0], 4) = -1 EPERM (Operation not permitted)<br>
setsockopt(51, SOL_IP, IP_TTL, [-1], 4) = 0<br>
connect(51, {sa_family=AF_INET, sin_port=htons(1029), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)<br>
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 52<br>
fcntl(52, F_GETFL)                      = 0x2 (flags O_RDWR)<br>
fcntl(52, F_SETFL, O_RDWR|O_NONBLOCK)   = 0<br>
setsockopt(52, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0<br>
setsockopt(52, SOL_SOCKET, SO_BINDTODEVICE, [0], 4) = -1 EPERM (Operation not permitted)<br>
setsockopt(52, SOL_IP, IP_TTL, [-1], 4) = 0<br>
connect(52, {sa_family=AF_INET, sin_port=htons(2013), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)<br>
select(53, [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52], [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52], [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52], {0, 0}) = 100 (in [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52], out [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52], left {0, 0})<br>
...<br>
<br>
I'm pretty sure the setsockopt() calls aren't essential.<br>
</blockquote></div><br></div>