IO::Socket autoflush by default, assume tcp and PeerAddr
Gisle Aas [Thu, 28 Aug 1997 02:36:50 +0000 (14:36 +1200)]
Subject: IO::Socket suggestion

The following patch to IO::Socket have this effect:

   - put IO::Socket objects in autoflush mode initially
   - assume Proto => "tcp" if no Proto is given (IO::Socket::INET)
   - a single argument to IO::Socket::INET->new is assumed to be
     a PeerAddr specification.

Comments?

It allows the following (rather long) one-liner to work:

 $ perl -I. -MIO::Socket -e '$s=IO::Socket::INET->new("www.perl.com:80");$s->print("HEAD / HTTP/1.0\n\n"); print<$s>'

Credited: Andy Dougherty <doughera@newton.phys.lafayette.edu>
Credited: M.J.T. Guy <mjtg@cus.cam.ac.uk>

p5p-msgid: hvi07zvo9.fsf@bergen.sn.no

ext/IO/lib/IO/Socket.pm

index ab19170..52c227a 100644 (file)
@@ -39,6 +39,8 @@ C<new> only looks for one key C<Domain> which tells new which domain
 the socket will be in. All other arguments will be passed to the
 configuration method of the package for that domain, See below.
 
+C<IO::Socket>s will be in autoflush mode after creation.
+
 =back
 
 =head1 METHODS
@@ -118,7 +120,7 @@ use Exporter;
 
 @ISA = qw(IO::Handle);
 
-$VERSION = "1.1602";
+$VERSION = "1.1603";
 
 sub import {
     my $pkg = shift;
@@ -129,6 +131,7 @@ sub import {
 sub new {
     my($class,%arg) = @_;
     my $fh = $class->SUPER::new();
+    $fh->autoflush;
 
     ${*$fh}{'io_socket_timeout'} = delete $arg{Timeout};
 
@@ -392,7 +395,7 @@ and some related methods. The constructor can take the following options
     PeerPort   Remote port or service       <service>[(<no>)] | <no>
     LocalAddr  Local host bind address      hostname[:port]
     LocalPort  Local host bind port         <service>[(<no>)] | <no>
-    Proto      Protocol name                "tcp" | "udp" | ...
+    Proto      Protocol name (or number)    "tcp" | "udp" | ...
     Type       Socket type                  SOCK_STREAM | SOCK_DGRAM | ...
     Listen     Queue size for listen
     Reuse      Set SO_REUSEADDR before binding
@@ -410,10 +413,13 @@ parenthesis which is used if the service is not known by the system.
 The C<PeerPort> specification can also be embedded in the C<PeerAddr>
 by preceding it with a ":".
 
-Only one of C<Type> or C<Proto> needs to be specified, one will be
-assumed from the other.  If you specify a symbolic C<PeerPort> port,
-then the constructor will try to derive C<Type> and C<Proto> from
-the service name.
+If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
+then the constructor will try to derive C<Proto> from the service
+name.  As a last resort C<Proto> "tcp" is assumed.  The C<Type>
+parameter will be deduced from C<Proto> if not specified.
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<PeerAddr> specification.
 
 Examples:
 
@@ -428,6 +434,9 @@ Examples:
                                  LocalPort => 9000,
                                  Proto     => 'tcp');
 
+   $sock = IO::Socket::INET->new('127.0.0.1:25');
+
+
 =head2 METHODS
 
 =over 4
@@ -463,6 +472,13 @@ peer host in a text form xx.xx.xx.xx
 
 =cut
 
+sub new
+{
+  my $class = shift;
+  unshift(@_, "PeerAddr") if @_ == 1;
+  return $class->SUPER::new(@_);
+}
+
 sub _sock_info {
   my($addr,$port,$proto) = @_;
   my @proto = ();
@@ -535,6 +551,7 @@ sub configure {
                unless(defined $raddr);
     }
 
+    $proto ||= (getprotobyname "tcp")[2];
     return _error($fh,'Cannot determine protocol')
        unless($proto);