I was flummoxed by the lack of the nonblocking
flags on sockets on microsoft windows, until I
realized that inside a nonblocking accept(2) call,
accept(2) is just going to have to do something
like a select(2).
So a non-blocking accept
IS NEVER REQUIRED because you can either
- just
accept one connection per iteration -- the other
ones will still be there on the next iteration or
- When you have a hot listening socket, accept
the first connection AND THEN SELECT AGAIN ON IT
AND ONLY IT.
So instead of
foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is nonblocking, goes until
# expected accept failure
while (accept(my $NewServer, $_)){
push @Clients, $NewServer
you just do do
foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is blocking, but we
# know this listener is hot
if (accept(my $NewServer, $_)){
push @Clients, $NewServer
}else{ log "accept: $!" }
Or, mock up the accept-em-all-NOW method
without clumsily making accept fail:
foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is blocking, but we
# know this listener is hot
acc:
accept(my $NewServer, $_) and
push @Clients, $NewServer;
# select again to see if there's another
my $rvec;
vec($rvec,fileno($_),1) = 1;
select($rvec,undef,undef,0);
vec($rvec,fileno($_),1) and goto acc;
The difference is
by accepting all connections immediately we
will possibly have more connections going, more suddenly. If
we have a limit on our number of open connections,
we only need to check it once per loop to keep
from overrunning it.
How much can it affect throughput? It's like
asking is it better for an office building to have a one-person
revolving door that spins fast
or a family-size one that spins slow.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.