Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I have a script that does
socket(SOCK, PF_INET, SOCK_STREAM, 6) || die "DaDa: ".$!;
# HP box has no getprotobyname ...
connect(SOCK, sockaddr_in($PORT, inet_aton($HOST))) || die "DaDa: ".$!;
at first and then occasionally writes to SOCK:
syswrite SOCK, pack 'N',((length $bla) +1);
syswrite SOCK, $bla."\n";

I donīt know what the other side is doing exactly. Seemingly it has some sort of timout after 30 seconds.
If thereīs more than 30s since the last pair of those syswrites, my script EXITS without saying anything at the 2nd one. Same thing when I use print instead of syswrite. Can you explain whatīs going on here? Is it a bug, a feature or my goof?
It is Perl 5.00503 on Linux 2.2.10 (SuSE 6.2).

Replies are listed 'Best First'.
Re: Exit/Crash on write to client socket
by AgentM (Curate) on Jan 27, 2001 at 02:04 UTC
    Every socket has a built-in timeout initialized to a system dependent deafult. To change this, use POSIX and setsockopt. Specifically:
    setsockopt sockid, proto, SO_SNDTIMEO (or SO_RCVTIMEO), ....
    read up on what follows since its dependent on the variable passed before. For better control over sockets, look into C or Inline. Additionally, I believe IO::Socket may help you.
    AgentM Systems nor Nasca Enterprises nor Bone::Easy nor Macperl is responsible for the comments made by AgentM. Remember, you can build any logical system with NOR.
      IO::Socket is no help at all, since I want the code to be portable across our intranet: Our elderly HP box seems to have a problem with getprotobyname() function (I donīt know why and I canīt do anything about that), so the whole IO::Socket module doesnīt work there. See sample below.
      Iīll play around with setsockopt() now. It should help, for otherwise there seems to be a serious flaw in the whole (Perl?) socket stuff: What if I donīt know anything about those 30s on the other side? <sigh>Iīve got 3 bright Perl books, each having a section on sockets, but none saying anything about the use of setsockopt() ... </sigh>

      Thanks for your help!
      --Martin

      #!/usr/bin/perl -w use IO::Socket; $sock = new IO::Socket::INET (PeerAddr => 'www.perlmonks.org', PeerPor +t => 80, Proto => 'tcp'); die "Mess: $!" unless $sock;
      results is:
      IO::Socket::INET: Cannot determine protocol at ./test.pl line 5
      Mess: Bad file number at ./test.pl line 6.
Re: Exit/Crash on write to client socket
by a (Friar) on Jan 27, 2001 at 09:37 UTC
    Yeah, AgentM has probably got it; I'd suggest looking at the cookbook (the code is available from O'Reilly) for an example that fits what you're trying to do.

    It was never clear to me if syswrite was a better idea than print SOCK ... except that you shouldn't mix them. Experience showed my problems were always else where and I could skip the syswrite/read and use print/<SOCK> as if it were a normal handle. YMMV wildly though.

    a