in reply to golf challenge: one-liner netcat clone

I don't see a check to see how much can be written without blocking. You can have a write in one direction blocking writes in the other direction, which can lead to a deadlock.

As for golfing, this bit:

139: socket($c,AF_INET,SOCK_STREAM,0)&&connect($c,sockaddr_in$ARGV[1], +inet_aton$ARGV[0])||die$!;fcntl$_,F_SETFL,O_NONBLOCK|fcntl$_,F_GETFL, +0 for

(whose only space is not needed) can be reduced to:

100: -MIO::Socket::INET $c=IO::Socket::INET->new(PeerHost=>"$ARGV[0]:$ +ARGV[1]")||die$!;$_->blocking(0)for

By the way, if you hardcoded the host and port, you could save a bunch more.

Update:

99: -MIO::Socket::INET $c=IO::Socket::INET->new(PeerHost,"$ARGV[0]:$A +RGV[1]")||die$!;$_->blocking(0)for 95: -MIO::Socket::INET $c=new IO::Socket::INET PeerHost,"$ARGV[0]:$AR +GV[1]"or die$!;blocking$_ 0for 85: -MIO::Socket::INET $c=new IO::Socket::INET"$ARGV[0]:$ARGV[1]"or d +ie$!;blocking$_ 0for

Replies are listed 'Best First'.
Re^2: golf challenge: one-liner netcat clone
by salva (Canon) on Dec 11, 2011 at 00:23 UTC
    $_->blocking(0) for *STDIN dies with a Can't call method "blocking" without a package or object reference

    On Linux, setting the sockets and pipes to non-blocking doesn't seem to be required at all, but I am not sure it other Unixes will perform the same.

      I take back my comment about write-blocking ("I don't see a check to see how much can be written without blocking"). I forgot to factor in that non-blocking applies to writing too.

      So you don't have a problem with syswrite, but you do have a problem with sysread. If the sysread would block, it'll return undef, and your program will exit prematurely.

      On Linux, setting the sockets and pipes to non-blocking doesn't seem to be required at all, but I am not sure it other Unixes will perform the same.

      Nonsense. Imagine if the remote end does

      print while <>;

      If you try reading from the socket, your program will become permanently blocked.

        If you try reading from the socket, your program will become permanently blocked.

        The select call takes care of that. The program only reads when there is data available and the buffer is not full.

      Did you load the module as I did? (Although you don't even need to do that with 5.14)