Hi Bob, thanks for the help. I think $sock will be closed when it goes out of scope anyhow. I tried removing that line and it didn't really have any effect.
As for forking in the client, it writes to the socket via one process and reads from it via the other. Probably not necessary, but that's how the guy that wrote the code snippet did it ;) I actually got this working by sleeping after the close $sock for a second.. apparently the socket needs a little time to close itself before you access it again. Strange.. thanks for the help! Ross -----Original Message----- From: bob ackerman [mailto:[EMAIL PROTECTED]] Sent: Friday, March 22, 2002 16:22 To: [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Subject: Re: forking unix sockets 'close $sock' in the child? Wouldn't that kill the socket for the parent. Then no more connections for parent. also, why 'fork' in the client? what's the point? On Friday, March 22, 2002, at 01:33 PM, Ross Simpson wrote: > I'm trying to build a forking server which uses unix domain sockets for > communication (on solaris 7). > I've run into a problem where once a connection has been established and > serviced by a child, my domain socket won't accept any more incoming > connections. > > I modified my code so it doesn't fork (handles all the connections itself) > , > and it will service any number of connections. As soon as I try and have > forked children handle the connections, the socket stops listening after > the > first transaction. The server then terminates, since the accept() call > fails. > > Another thing: it works fine on redhat linux, but on solaris I have the > above problem. Is there a trick to using domain sockets in perl? Am I > missing something? > > thanks, > ross > > > ----------- > the server: > > > #!/usr/local/bin/perl -w > > use IO::Socket; > use POSIX ":sys_wait_h"; > use strict; > > my $sockname = "/tmp/unixsockd.sock"; > > service_clients (get_sock ()); > > sub get_sock > { > unlink $sockname; > my $sock = IO::Socket::UNIX->new ( > Local => $sockname, > Type => SOCK_STREAM, > Listen => SOMAXCONN, > ) > or die "$0: error starting daemon on '$sockname': $@\n"; > return $sock; > } > > sub service_clients > { > my $sock = shift; > $SIG{CHLD} = \&reaper; > > while (my $client = $sock->accept ()) > { > next if my $pid = fork (); > die "Cannot fork\n" unless defined $pid; > > # child > close $sock; # no use to child > process_requests ($client); > exit; # terminate child > } > continue > { > close $client; # no use to parent > } > } > > sub process_requests > { > my $client = shift; > while (defined (my $line = <$client>)) > { > last if $line =~ /^\s$/; # exit on empty line > chomp $line; > printf $client "%s: %s, handled by PID %d\n", > scalar localtime (time), $line, $$; > } > } > > sub reaper > { > while (waitpid (-1,WNOHANG) > 0) {} > $SIG{CHLD} = \&reaper; > } > > > --------------- > and the client: > > #!/usr/local/bin/perl -w > > use IO::Socket; > > my $sockname = "/tmp/unixsockd.sock"; > my $client = IO::Socket::UNIX->new( > Peer => $sockname, > Type => SOCK_STREAM, > Timeout => 5, > ) > or die "$0: error connecting to '$sockname': $@\n"; > > my $pid = fork (); > die "Cannot fork\n" unless defined $pid; > > if ($pid) > { > write_sock (); > waitpid ($pid, 0); > } > else > { > read_sock (); > } > > sub write_sock > { > for (1..1000) > { > print $client "testline number $_\n"; > } > print $client "\n"; > print "Done writing.\n"; > } > > sub read_sock > { > print $line while (my $line = <$client>); > } > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]