Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

(tye)Re: Non blocking socket open

by tye (Sage)
on Jun 29, 2001 at 20:22 UTC ( #92704=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Non blocking socket open
in thread Non blocking socket open

It wouldn't be hard to make blocking(0) work under Win32. The code to change is in the Perl source distribution in ext/IO/IO.xs. This patch needs to be sent to p5p, so if you have the motivation to find the tuits to get that done, then many, many people would be appreciative.

See the previously noted thread and the follow up for details on solutions and patch ideas.

        - tye (but my friends call me "Tye")

Replies are listed 'Best First'.
Re: (to be updated) (tye)Re: Non blocking socket open
by MeowChow (Vicar) on Jun 30, 2001 at 10:21 UTC
    I discovered that you can actually do non-blocking connects without patching the Perl source, and fairly portably too, so long as you set up a few OS-dependant constants and subs. Here's some code I wrote a while back for just this purpose. If you ask nicely, you might just coax an explanation out of me too (that is, after I've figured out how it works again :-)
    package Portable::NonBlock; use strict; use vars qw(@ISA @EXPORT @EXPORT_OK); require Exporter; use POSIX; use Socket; use Symbol; @EXPORT = qw(); @EXPORT_OK = qw(setnonblock FIONBIO EAGAIN); @ISA = qw(Exporter); ### Default ### *setsocknonblock = sub { my $sock = shift; my $flags = fcntl($sock, F_GETFL, 0) or warn "Can't get the fcntl flags on socket: $!\n"; fcntl($sock, F_SETFL, $flags | O_NONBLOCK) or warn "Can't fcntl socket to non-blocking: $!\n"; }; ### Win32 ### sub SO_OPENTYPE { 0x7008 } if ($^O eq 'MSWin32') { *POSIX::FIONBIO = sub { 0x8004667E }; # Gleaned from VC++ winso +ck2.h (\x8004667E) *POSIX::EAGAIN = sub { 10035; }; # Gleaned by forcing a no +n-blocking send # Total *HACK* to allow winsock connect() to work on non-blocking so +ckets # Culprit is in perl source /win32/win32sck.c function set_socktype. + We undo # the result of this function. See MSDN support on overlapped I/O fo +r background # info: +SP my $sock = gensym(); socket($sock, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or print "PORTABLE::BEGIN ERROR - can't create socket\n"; setsockopt($sock, SOL_SOCKET, SO_OPENTYPE, 0) or print "PORTABLE::BEGIN ERROR - Can't setsockopt to overlapped: $!\ +n"; close $sock; # Can't fcntl in windows, so we ioctlsocket. my $truevalue = 1; *setsocknonblock = sub { my $sock = shift; ioctl($sock, POSIX::FIONBIO(), \$truevalue) or warn "Can't ioctl socket to non-blocking: $!\n"; }; }
                   s aamecha.s a..a\u$&owag.print

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://92704]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (8)
As of 2021-01-18 11:39 GMT
Find Nodes?
    Voting Booth?