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]