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.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.