This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
mention the C<$SIG{CHLD} = 'IGNORE'> special case
[perl5.git] / pod / perlipc.pod
CommitLineData
a0d0e21e
LW
1=head1 NAME
2
184e9718 3perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
a0d0e21e
LW
4
5=head1 DESCRIPTION
6
4633a7c4
LW
7The basic IPC facilities of Perl are built out of the good old Unix
8signals, named pipes, pipe opens, the Berkeley socket routines, and SysV
9IPC calls. Each is used in slightly different situations.
10
11=head1 Signals
12
13Perl uses a simple signal handling model: the %SIG hash contains names or
14references of user-installed signal handlers. These handlers will be called
15with an argument which is the name of the signal that triggered it. A
16signal may be generated intentionally from a particular keyboard sequence like
a2eb9003 17control-C or control-Z, sent to you from another process, or
4633a7c4 18triggered automatically by the kernel when special events transpire, like
54310121 19a child process exiting, your process running out of stack space, or
4633a7c4
LW
20hitting file size limit.
21
22For example, to trap an interrupt signal, set up a handler like this.
7b05b7e3
TC
23Do as little as you possibly can in your handler; notice how all we do is
24set a global variable and then raise an exception. That's because on most
25systems, libraries are not re-entrant; particularly, memory allocation and
26I/O routines are not. That means that doing nearly I<anything> in your
27handler could in theory trigger a memory fault and subsequent core dump.
4633a7c4
LW
28
29 sub catch_zap {
30 my $signame = shift;
31 $shucks++;
32 die "Somebody sent me a SIG$signame";
54310121 33 }
4633a7c4
LW
34 $SIG{INT} = 'catch_zap'; # could fail in modules
35 $SIG{INT} = \&catch_zap; # best strategy
36
37The names of the signals are the ones listed out by C<kill -l> on your
38system, or you can retrieve them from the Config module. Set up an
39@signame list indexed by number to get the name and a %signo table
40indexed by name to get the number:
41
42 use Config;
43 defined $Config{sig_name} || die "No sigs?";
44 foreach $name (split(' ', $Config{sig_name})) {
45 $signo{$name} = $i;
46 $signame[$i] = $name;
47 $i++;
54310121 48 }
4633a7c4 49
6a3992aa 50So to check whether signal 17 and SIGALRM were the same, do just this:
4633a7c4
LW
51
52 print "signal #17 = $signame[17]\n";
54310121 53 if ($signo{ALRM}) {
4633a7c4 54 print "SIGALRM is $signo{ALRM}\n";
54310121 55 }
4633a7c4
LW
56
57You may also choose to assign the strings C<'IGNORE'> or C<'DEFAULT'> as
58the handler, in which case Perl will try to discard the signal or do the
f648820c
GS
59default thing.
60
61On most UNIX platforms, the C<CHLD> (sometimes also known as C<CLD>) signal
62has special behavior with respect to a value of C<'IGNORE'>.
63Setting C<$SIG{CHLD}> to C<'IGNORE'> on such a platform has the effect of
64not creating zombie processes when the parent process fails to C<wait()>
65on its child processes (i.e. child processes are automatically reaped).
66Calling C<wait()> with C<$SIG{CHLD}> set to C<'IGNORE'> usually returns
67C<-1> on such platforms.
68
69Some signals can be neither trapped nor ignored, such as
4633a7c4
LW
70the KILL and STOP (but not the TSTP) signals. One strategy for
71temporarily ignoring signals is to use a local() statement, which will be
72automatically restored once your block is exited. (Remember that local()
73values are "inherited" by functions called from within that block.)
74
75 sub precious {
76 local $SIG{INT} = 'IGNORE';
77 &more_functions;
54310121 78 }
4633a7c4
LW
79 sub more_functions {
80 # interrupts still ignored, for now...
54310121 81 }
4633a7c4
LW
82
83Sending a signal to a negative process ID means that you send the signal
fb73857a 84to the entire Unix process-group. This code sends a hang-up signal to all
85processes in the current process group (and sets $SIG{HUP} to IGNORE so
86it doesn't kill itself):
4633a7c4
LW
87
88 {
89 local $SIG{HUP} = 'IGNORE';
90 kill HUP => -$$;
91 # snazzy writing of: kill('HUP', -$$)
92 }
a0d0e21e 93
4633a7c4
LW
94Another interesting signal to send is signal number zero. This doesn't
95actually affect another process, but instead checks whether it's alive
54310121 96or has changed its UID.
a0d0e21e 97
4633a7c4
LW
98 unless (kill 0 => $kid_pid) {
99 warn "something wicked happened to $kid_pid";
54310121 100 }
a0d0e21e 101
4633a7c4
LW
102You might also want to employ anonymous functions for simple signal
103handlers:
a0d0e21e 104
4633a7c4 105 $SIG{INT} = sub { die "\nOutta here!\n" };
a0d0e21e 106
4633a7c4 107But that will be problematic for the more complicated handlers that need
54310121 108to reinstall themselves. Because Perl's signal mechanism is currently
184e9718 109based on the signal(3) function from the C library, you may sometimes be so
4633a7c4
LW
110misfortunate as to run on systems where that function is "broken", that
111is, it behaves in the old unreliable SysV way rather than the newer, more
112reasonable BSD and POSIX fashion. So you'll see defensive people writing
113signal handlers like this:
a0d0e21e 114
54310121 115 sub REAPER {
4633a7c4 116 $waitedpid = wait;
6a3992aa
DL
117 # loathe sysV: it makes us not only reinstate
118 # the handler, but place it after the wait
54310121 119 $SIG{CHLD} = \&REAPER;
4633a7c4
LW
120 }
121 $SIG{CHLD} = \&REAPER;
122 # now do something that forks...
123
124or even the more elaborate:
125
6a3992aa 126 use POSIX ":sys_wait_h";
54310121 127 sub REAPER {
4633a7c4 128 my $child;
4633a7c4
LW
129 while ($child = waitpid(-1,WNOHANG)) {
130 $Kid_Status{$child} = $?;
54310121 131 }
6a3992aa 132 $SIG{CHLD} = \&REAPER; # still loathe sysV
4633a7c4
LW
133 }
134 $SIG{CHLD} = \&REAPER;
135 # do something that forks...
136
137Signal handling is also used for timeouts in Unix, While safely
138protected within an C<eval{}> block, you set a signal handler to trap
139alarm signals and then schedule to have one delivered to you in some
140number of seconds. Then try your blocking operation, clearing the alarm
141when it's done but not before you've exited your C<eval{}> block. If it
142goes off, you'll use die() to jump out of the block, much as you might
143using longjmp() or throw() in other languages.
144
145Here's an example:
146
54310121 147 eval {
4633a7c4 148 local $SIG{ALRM} = sub { die "alarm clock restart" };
54310121 149 alarm 10;
4633a7c4 150 flock(FH, 2); # blocking write lock
54310121 151 alarm 0;
4633a7c4
LW
152 };
153 if ($@ and $@ !~ /alarm clock restart/) { die }
154
155For more complex signal handling, you might see the standard POSIX
156module. Lamentably, this is almost entirely undocumented, but
157the F<t/lib/posix.t> file from the Perl source distribution has some
158examples in it.
159
160=head1 Named Pipes
161
162A named pipe (often referred to as a FIFO) is an old Unix IPC
163mechanism for processes communicating on the same machine. It works
54310121 164just like a regular, connected anonymous pipes, except that the
4633a7c4
LW
165processes rendezvous using a filename and don't have to be related.
166
167To create a named pipe, use the Unix command mknod(1) or on some
168systems, mkfifo(1). These may not be in your normal path.
169
170 # system return val is backwards, so && not ||
171 #
172 $ENV{PATH} .= ":/etc:/usr/etc";
54310121 173 if ( system('mknod', $path, 'p')
4633a7c4
LW
174 && system('mkfifo', $path) )
175 {
5a964f20 176 die "mk{nod,fifo} $path failed";
54310121 177 }
4633a7c4
LW
178
179
180A fifo is convenient when you want to connect a process to an unrelated
181one. When you open a fifo, the program will block until there's something
54310121 182on the other end.
4633a7c4
LW
183
184For example, let's say you'd like to have your F<.signature> file be a
185named pipe that has a Perl program on the other end. Now every time any
6a3992aa 186program (like a mailer, news reader, finger program, etc.) tries to read
4633a7c4 187from that file, the reading program will block and your program will
6a3992aa 188supply the new signature. We'll use the pipe-checking file test B<-p>
4633a7c4
LW
189to find out whether anyone (or anything) has accidentally removed our fifo.
190
191 chdir; # go home
192 $FIFO = '.signature';
193 $ENV{PATH} .= ":/etc:/usr/games";
194
195 while (1) {
196 unless (-p $FIFO) {
197 unlink $FIFO;
54310121 198 system('mknod', $FIFO, 'p')
4633a7c4 199 && die "can't mknod $FIFO: $!";
54310121 200 }
4633a7c4
LW
201
202 # next line blocks until there's a reader
203 open (FIFO, "> $FIFO") || die "can't write $FIFO: $!";
204 print FIFO "John Smith (smith\@host.org)\n", `fortune -s`;
205 close FIFO;
6a3992aa 206 sleep 2; # to avoid dup signals
4633a7c4 207 }
a0d0e21e 208
5a964f20
TC
209=head2 WARNING
210
211By installing Perl code to deal with signals, you're exposing yourself
212to danger from two things. First, few system library functions are
213re-entrant. If the signal interrupts while Perl is executing one function
214(like malloc(3) or printf(3)), and your signal handler then calls the
215same function again, you could get unpredictable behavior--often, a
216core dump. Second, Perl isn't itself re-entrant at the lowest levels.
217If the signal interrupts Perl while Perl is changing its own internal
218data structures, similarly unpredictable behaviour may result.
219
220There are two things you can do, knowing this: be paranoid or be
221pragmatic. The paranoid approach is to do as little as possible in your
222signal handler. Set an existing integer variable that already has a
223value, and return. This doesn't help you if you're in a slow system call,
224which will just restart. That means you have to C<die> to longjump(3) out
225of the handler. Even this is a little cavalier for the true paranoiac,
226who avoids C<die> in a handler because the system I<is> out to get you.
227The pragmatic approach is to say ``I know the risks, but prefer the
228convenience'', and to do anything you want in your signal handler,
229prepared to clean up core dumps now and again.
230
231To forbid signal handlers altogether would bars you from
232many interesting programs, including virtually everything in this manpage,
233since you could no longer even write SIGCHLD handlers. Their dodginess
234is expected to be addresses in the 5.005 release.
235
a0d0e21e 236
4633a7c4
LW
237=head1 Using open() for IPC
238
239Perl's basic open() statement can also be used for unidirectional interprocess
240communication by either appending or prepending a pipe symbol to the second
a2eb9003 241argument to open(). Here's how to start something up in a child process you
4633a7c4
LW
242intend to write to:
243
54310121 244 open(SPOOLER, "| cat -v | lpr -h 2>/dev/null")
4633a7c4
LW
245 || die "can't fork: $!";
246 local $SIG{PIPE} = sub { die "spooler pipe broke" };
247 print SPOOLER "stuff\n";
248 close SPOOLER || die "bad spool: $! $?";
249
250And here's how to start up a child process you intend to read from:
251
252 open(STATUS, "netstat -an 2>&1 |")
253 || die "can't fork: $!";
254 while (<STATUS>) {
255 next if /^(tcp|udp)/;
256 print;
54310121 257 }
a2eb9003 258 close STATUS || die "bad netstat: $! $?";
4633a7c4
LW
259
260If one can be sure that a particular program is a Perl script that is
261expecting filenames in @ARGV, the clever programmer can write something
262like this:
263
5a964f20 264 % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
4633a7c4
LW
265
266and irrespective of which shell it's called from, the Perl program will
267read from the file F<f1>, the process F<cmd1>, standard input (F<tmpfile>
268in this case), the F<f2> file, the F<cmd2> command, and finally the F<f3>
269file. Pretty nifty, eh?
270
54310121 271You might notice that you could use backticks for much the
4633a7c4
LW
272same effect as opening a pipe for reading:
273
274 print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`;
275 die "bad netstat" if $?;
276
277While this is true on the surface, it's much more efficient to process the
278file one line or record at a time because then you don't have to read the
279whole thing into memory at once. It also gives you finer control of the
280whole process, letting you to kill off the child process early if you'd
281like.
282
283Be careful to check both the open() and the close() return values. If
284you're I<writing> to a pipe, you should also trap SIGPIPE. Otherwise,
285think of what happens when you start up a pipe to a command that doesn't
286exist: the open() will in all likelihood succeed (it only reflects the
287fork()'s success), but then your output will fail--spectacularly. Perl
288can't know whether the command worked because your command is actually
289running in a separate process whose exec() might have failed. Therefore,
6a3992aa 290while readers of bogus commands return just a quick end of file, writers
4633a7c4
LW
291to bogus command will trigger a signal they'd better be prepared to
292handle. Consider:
293
5a964f20
TC
294 open(FH, "|bogus") or die "can't fork: $!";
295 print FH "bang\n" or die "can't write: $!";
296 close FH or die "can't close: $!";
297
298That won't blow up until the close, and it will blow up with a SIGPIPE.
299To catch it, you could use this:
300
301 $SIG{PIPE} = 'IGNORE';
302 open(FH, "|bogus") or die "can't fork: $!";
303 print FH "bang\n" or die "can't write: $!";
304 close FH or die "can't close: status=$?";
4633a7c4 305
68dc0745 306=head2 Filehandles
307
5a964f20
TC
308Both the main process and any child processes it forks share the same
309STDIN, STDOUT, and STDERR filehandles. If both processes try to access
310them at once, strange things can happen. You'll certainly want to any
311stdio flush output buffers before forking. You may also want to close
312or reopen the filehandles for the child. You can get around this by
313opening your pipe with open(), but on some systems this means that the
314child process cannot outlive the parent.
68dc0745 315
316=head2 Background Processes
317
318You can run a command in the background with:
319
7b05b7e3 320 system("cmd &");
68dc0745 321
322The command's STDOUT and STDERR (and possibly STDIN, depending on your
323shell) will be the same as the parent's. You won't need to catch
324SIGCHLD because of the double-fork taking place (see below for more
325details).
326
327=head2 Complete Dissociation of Child from Parent
328
329In some cases (starting server processes, for instance) you'll want to
893af57a
RS
330completely dissociate the child process from the parent. This is
331often called daemonization. A well behaved daemon will also chdir()
332to the root directory (so it doesn't prevent unmounting the filesystem
333containing the directory from which it was launched) and redirect its
334standard file descriptors from and to F</dev/null> (so that random
335output doesn't wind up on the user's terminal).
336
337 use POSIX 'setsid';
338
339 sub daemonize {
340 chdir '/' or die "Can't chdir to /: $!";
341 open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
342 open STDOUT, '>/dev/null'
343 or die "Can't write to /dev/null: $!";
344 defined(my $pid = fork) or die "Can't fork: $!";
345 exit if $pid;
346 setsid or die "Can't start a new session: $!";
347 open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
348 }
5a964f20 349
893af57a
RS
350The fork() has to come before the setsid() to ensure that you aren't a
351process group leader (the setsid() will fail if you are). If your
352system doesn't have the setsid() function, open F</dev/tty> and use the
353C<TIOCNOTTY> ioctl() on it instead. See L<tty(4)> for details.
5a964f20 354
893af57a
RS
355Non-Unix users should check their Your_OS::Process module for other
356solutions.
68dc0745 357
4633a7c4
LW
358=head2 Safe Pipe Opens
359
360Another interesting approach to IPC is making your single program go
361multiprocess and communicate between (or even amongst) yourselves. The
362open() function will accept a file argument of either C<"-|"> or C<"|-">
363to do a very interesting thing: it forks a child connected to the
364filehandle you've opened. The child is running the same program as the
365parent. This is useful for safely opening a file when running under an
366assumed UID or GID, for example. If you open a pipe I<to> minus, you can
367write to the filehandle you opened and your kid will find it in his
368STDIN. If you open a pipe I<from> minus, you can read from the filehandle
369you opened whatever your kid writes to his STDOUT.
370
371 use English;
372 my $sleep_count = 0;
373
54310121 374 do {
c07a80fd 375 $pid = open(KID_TO_WRITE, "|-");
4633a7c4
LW
376 unless (defined $pid) {
377 warn "cannot fork: $!";
378 die "bailing out" if $sleep_count++ > 6;
379 sleep 10;
54310121 380 }
4633a7c4
LW
381 } until defined $pid;
382
383 if ($pid) { # parent
c07a80fd 384 print KID_TO_WRITE @some_data;
385 close(KID_TO_WRITE) || warn "kid exited $?";
4633a7c4
LW
386 } else { # child
387 ($EUID, $EGID) = ($UID, $GID); # suid progs only
54310121 388 open (FILE, "> /safe/file")
4633a7c4
LW
389 || die "can't open /safe/file: $!";
390 while (<STDIN>) {
391 print FILE; # child's STDIN is parent's KID
54310121 392 }
4633a7c4 393 exit; # don't forget this
54310121 394 }
4633a7c4
LW
395
396Another common use for this construct is when you need to execute
397something without the shell's interference. With system(), it's
54310121 398straightforward, but you can't use a pipe open or backticks safely.
4633a7c4
LW
399That's because there's no way to stop the shell from getting its hands on
400your arguments. Instead, use lower-level control to call exec() directly.
401
54310121 402Here's a safe backtick or pipe open for read:
4633a7c4
LW
403
404 # add error processing as above
c07a80fd 405 $pid = open(KID_TO_READ, "-|");
4633a7c4
LW
406
407 if ($pid) { # parent
c07a80fd 408 while (<KID_TO_READ>) {
4633a7c4 409 # do something interesting
54310121 410 }
c07a80fd 411 close(KID_TO_READ) || warn "kid exited $?";
4633a7c4
LW
412
413 } else { # child
414 ($EUID, $EGID) = ($UID, $GID); # suid only
415 exec($program, @options, @args)
416 || die "can't exec program: $!";
417 # NOTREACHED
54310121 418 }
4633a7c4
LW
419
420
421And here's a safe pipe open for writing:
422
423 # add error processing as above
c07a80fd 424 $pid = open(KID_TO_WRITE, "|-");
4633a7c4
LW
425 $SIG{ALRM} = sub { die "whoops, $program pipe broke" };
426
427 if ($pid) { # parent
428 for (@data) {
c07a80fd 429 print KID_TO_WRITE;
54310121 430 }
c07a80fd 431 close(KID_TO_WRITE) || warn "kid exited $?";
4633a7c4
LW
432
433 } else { # child
434 ($EUID, $EGID) = ($UID, $GID);
435 exec($program, @options, @args)
436 || die "can't exec program: $!";
437 # NOTREACHED
54310121 438 }
4633a7c4
LW
439
440Note that these operations are full Unix forks, which means they may not be
441correctly implemented on alien systems. Additionally, these are not true
54310121 442multithreading. If you'd like to learn more about threading, see the
184e9718 443F<modules> file mentioned below in the SEE ALSO section.
4633a7c4 444
7b05b7e3 445=head2 Bidirectional Communication with Another Process
4633a7c4
LW
446
447While this works reasonably well for unidirectional communication, what
448about bidirectional communication? The obvious thing you'd like to do
449doesn't actually work:
450
c07a80fd 451 open(PROG_FOR_READING_AND_WRITING, "| some program |")
4633a7c4 452
54310121 453and if you forget to use the B<-w> flag, then you'll miss out
4633a7c4
LW
454entirely on the diagnostic message:
455
456 Can't do bidirectional pipe at -e line 1.
457
458If you really want to, you can use the standard open2() library function
7b05b7e3 459to catch both ends. There's also an open3() for tridirectional I/O so you
4633a7c4
LW
460can also catch your child's STDERR, but doing so would then require an
461awkward select() loop and wouldn't allow you to use normal Perl input
462operations.
463
464If you look at its source, you'll see that open2() uses low-level
5a964f20 465primitives like Unix pipe() and exec() calls to create all the connections.
4633a7c4
LW
466While it might have been slightly more efficient by using socketpair(), it
467would have then been even less portable than it already is. The open2()
468and open3() functions are unlikely to work anywhere except on a Unix
469system or some other one purporting to be POSIX compliant.
470
471Here's an example of using open2():
472
473 use FileHandle;
474 use IPC::Open2;
5a964f20 475 $pid = open2(*Reader, *Writer, "cat -u -n" );
4633a7c4
LW
476 Writer->autoflush(); # default here, actually
477 print Writer "stuff\n";
478 $got = <Reader>;
479
6a3992aa
DL
480The problem with this is that Unix buffering is really going to
481ruin your day. Even though your C<Writer> filehandle is auto-flushed,
4633a7c4 482and the process on the other end will get your data in a timely manner,
6a3992aa 483you can't usually do anything to force it to give it back to you
54310121 484in a similarly quick fashion. In this case, we could, because we
4633a7c4
LW
485gave I<cat> a B<-u> flag to make it unbuffered. But very few Unix
486commands are designed to operate over pipes, so this seldom works
54310121 487unless you yourself wrote the program on the other end of the
4633a7c4
LW
488double-ended pipe.
489
54310121 490A solution to this is the nonstandard F<Comm.pl> library. It uses
4633a7c4
LW
491pseudo-ttys to make your program behave more reasonably:
492
493 require 'Comm.pl';
494 $ph = open_proc('cat -n');
495 for (1..10) {
496 print $ph "a line\n";
497 print "got back ", scalar <$ph>;
498 }
a0d0e21e 499
4633a7c4 500This way you don't have to have control over the source code of the
54310121 501program you're using. The F<Comm> library also has expect()
502and interact() functions. Find the library (and we hope its
4633a7c4 503successor F<IPC::Chat>) at your nearest CPAN archive as detailed
184e9718 504in the SEE ALSO section below.
a0d0e21e 505
c8db1d39
TC
506The newer Expect.pm module from CPAN also addresses this kind of thing.
507This module requires two other modules from CPAN: IO::Pty and IO::Stty.
508It sets up a pseudo-terminal to interact with programs that insist on
509using talking to the terminal device driver. If your system is
510amongst those supported, this may be your best bet.
511
5a964f20
TC
512=head2 Bidirectional Communication with Yourself
513
514If you want, you may make low-level pipe() and fork()
515to stitch this together by hand. This example only
516talks to itself, but you could reopen the appropriate
517handles to STDIN and STDOUT and call other processes.
518
519 #!/usr/bin/perl -w
520 # pipe1 - bidirectional communication using two pipe pairs
521 # designed for the socketpair-challenged
522 use IO::Handle; # thousands of lines just for autoflush :-(
523 pipe(PARENT_RDR, CHILD_WTR); # XXX: failure?
524 pipe(CHILD_RDR, PARENT_WTR); # XXX: failure?
525 CHILD_WTR->autoflush(1);
526 PARENT_WTR->autoflush(1);
527
528 if ($pid = fork) {
529 close PARENT_RDR; close PARENT_WTR;
530 print CHILD_WTR "Parent Pid $$ is sending this\n";
531 chomp($line = <CHILD_RDR>);
532 print "Parent Pid $$ just read this: `$line'\n";
533 close CHILD_RDR; close CHILD_WTR;
534 waitpid($pid,0);
535 } else {
536 die "cannot fork: $!" unless defined $pid;
537 close CHILD_RDR; close CHILD_WTR;
538 chomp($line = <PARENT_RDR>);
539 print "Child Pid $$ just read this: `$line'\n";
540 print PARENT_WTR "Child Pid $$ is sending this\n";
541 close PARENT_RDR; close PARENT_WTR;
542 exit;
543 }
544
545But you don't actually have to make two pipe calls. If you
546have the socketpair() system call, it will do this all for you.
547
548 #!/usr/bin/perl -w
549 # pipe2 - bidirectional communication using socketpair
550 # "the best ones always go both ways"
551
552 use Socket;
553 use IO::Handle; # thousands of lines just for autoflush :-(
554 # We say AF_UNIX because although *_LOCAL is the
555 # POSIX 1003.1g form of the constant, many machines
556 # still don't have it.
557 socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
558 or die "socketpair: $!";
559
560 CHILD->autoflush(1);
561 PARENT->autoflush(1);
562
563 if ($pid = fork) {
564 close PARENT;
565 print CHILD "Parent Pid $$ is sending this\n";
566 chomp($line = <CHILD>);
567 print "Parent Pid $$ just read this: `$line'\n";
568 close CHILD;
569 waitpid($pid,0);
570 } else {
571 die "cannot fork: $!" unless defined $pid;
572 close CHILD;
573 chomp($line = <PARENT>);
574 print "Child Pid $$ just read this: `$line'\n";
575 print PARENT "Child Pid $$ is sending this\n";
576 close PARENT;
577 exit;
578 }
579
4633a7c4 580=head1 Sockets: Client/Server Communication
a0d0e21e 581
6a3992aa 582While not limited to Unix-derived operating systems (e.g., WinSock on PCs
4633a7c4 583provides socket support, as do some VMS libraries), you may not have
184e9718 584sockets on your system, in which case this section probably isn't going to do
6a3992aa
DL
585you much good. With sockets, you can do both virtual circuits (i.e., TCP
586streams) and datagrams (i.e., UDP packets). You may be able to do even more
4633a7c4
LW
587depending on your system.
588
589The Perl function calls for dealing with sockets have the same names as
590the corresponding system calls in C, but their arguments tend to differ
591for two reasons: first, Perl filehandles work differently than C file
592descriptors. Second, Perl already knows the length of its strings, so you
593don't need to pass that information.
a0d0e21e 594
4633a7c4
LW
595One of the major problems with old socket code in Perl was that it used
596hard-coded values for some of the constants, which severely hurt
597portability. If you ever see code that does anything like explicitly
598setting C<$AF_INET = 2>, you know you're in for big trouble: An
599immeasurably superior approach is to use the C<Socket> module, which more
600reliably grants access to various constants and functions you'll need.
a0d0e21e 601
68dc0745 602If you're not writing a server/client for an existing protocol like
603NNTP or SMTP, you should give some thought to how your server will
604know when the client has finished talking, and vice-versa. Most
605protocols are based on one-line messages and responses (so one party
4a6725af 606knows the other has finished when a "\n" is received) or multi-line
68dc0745 607messages and responses that end with a period on an empty line
608("\n.\n" terminates a message/response).
609
5a964f20
TC
610=head2 Internet Line Terminators
611
612The Internet line terminator is "\015\012". Under ASCII variants of
613Unix, that could usually be written as "\r\n", but under other systems,
614"\r\n" might at times be "\015\015\012", "\012\012\015", or something
615completely different. The standards specify writing "\015\012" to be
616conformant (be strict in what you provide), but they also recommend
617accepting a lone "\012" on input (but be lenient in what you require).
618We haven't always been very good about that in the code in this manpage,
619but unless you're on a Mac, you'll probably be ok.
620
4633a7c4 621=head2 Internet TCP Clients and Servers
a0d0e21e 622
4633a7c4
LW
623Use Internet-domain sockets when you want to do client-server
624communication that might extend to machines outside of your own system.
625
626Here's a sample TCP client using Internet-domain sockets:
627
628 #!/usr/bin/perl -w
4633a7c4
LW
629 use strict;
630 use Socket;
631 my ($remote,$port, $iaddr, $paddr, $proto, $line);
632
633 $remote = shift || 'localhost';
634 $port = shift || 2345; # random port
635 if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
636 die "No port" unless $port;
637 $iaddr = inet_aton($remote) || die "no host: $remote";
638 $paddr = sockaddr_in($port, $iaddr);
639
640 $proto = getprotobyname('tcp');
641 socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
642 connect(SOCK, $paddr) || die "connect: $!";
54310121 643 while (defined($line = <SOCK>)) {
4633a7c4 644 print $line;
54310121 645 }
4633a7c4
LW
646
647 close (SOCK) || die "close: $!";
648 exit;
649
650And here's a corresponding server to go along with it. We'll
651leave the address as INADDR_ANY so that the kernel can choose
54310121 652the appropriate interface on multihomed hosts. If you want sit
c07a80fd 653on a particular interface (like the external side of a gateway
654or firewall machine), you should fill this in with your real address
655instead.
656
657 #!/usr/bin/perl -Tw
c07a80fd 658 use strict;
659 BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
660 use Socket;
661 use Carp;
5a964f20 662 $EOL = "\015\012";
c07a80fd 663
54310121 664 sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
c07a80fd 665
666 my $port = shift || 2345;
667 my $proto = getprotobyname('tcp');
6a3992aa
DL
668 $port = $1 if $port =~ /(\d+)/; # untaint port number
669
c07a80fd 670 socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
54310121 671 setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
c07a80fd 672 pack("l", 1)) || die "setsockopt: $!";
673 bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
674 listen(Server,SOMAXCONN) || die "listen: $!";
675
676 logmsg "server started on port $port";
677
678 my $paddr;
679
680 $SIG{CHLD} = \&REAPER;
681
682 for ( ; $paddr = accept(Client,Server); close Client) {
683 my($port,$iaddr) = sockaddr_in($paddr);
684 my $name = gethostbyaddr($iaddr,AF_INET);
685
54310121 686 logmsg "connection from $name [",
687 inet_ntoa($iaddr), "]
c07a80fd 688 at port $port";
689
54310121 690 print Client "Hello there, $name, it's now ",
5a964f20 691 scalar localtime, $EOL;
54310121 692 }
c07a80fd 693
54310121 694And here's a multithreaded version. It's multithreaded in that
695like most typical servers, it spawns (forks) a slave server to
c07a80fd 696handle the client request so that the master server can quickly
697go back to service a new client.
4633a7c4
LW
698
699 #!/usr/bin/perl -Tw
4633a7c4
LW
700 use strict;
701 BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
a0d0e21e 702 use Socket;
4633a7c4 703 use Carp;
5a964f20 704 $EOL = "\015\012";
a0d0e21e 705
4633a7c4 706 sub spawn; # forward declaration
54310121 707 sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
a0d0e21e 708
4633a7c4
LW
709 my $port = shift || 2345;
710 my $proto = getprotobyname('tcp');
80aa6872 711 $port = $1 if $port =~ /(\d+)/; # untaint port number
54310121 712
c07a80fd 713 socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
54310121 714 setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
c07a80fd 715 pack("l", 1)) || die "setsockopt: $!";
716 bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
717 listen(Server,SOMAXCONN) || die "listen: $!";
a0d0e21e 718
4633a7c4 719 logmsg "server started on port $port";
a0d0e21e 720
4633a7c4
LW
721 my $waitedpid = 0;
722 my $paddr;
a0d0e21e 723
54310121 724 sub REAPER {
4633a7c4 725 $waitedpid = wait;
6a3992aa 726 $SIG{CHLD} = \&REAPER; # loathe sysV
4633a7c4
LW
727 logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
728 }
729
730 $SIG{CHLD} = \&REAPER;
731
54310121 732 for ( $waitedpid = 0;
733 ($paddr = accept(Client,Server)) || $waitedpid;
734 $waitedpid = 0, close Client)
4633a7c4 735 {
6a3992aa 736 next if $waitedpid and not $paddr;
4633a7c4
LW
737 my($port,$iaddr) = sockaddr_in($paddr);
738 my $name = gethostbyaddr($iaddr,AF_INET);
739
54310121 740 logmsg "connection from $name [",
741 inet_ntoa($iaddr), "]
4633a7c4 742 at port $port";
a0d0e21e 743
54310121 744 spawn sub {
5a964f20
TC
745 print "Hello there, $name, it's now ", scalar localtime, $EOL;
746 exec '/usr/games/fortune' # XXX: `wrong' line terminators
4633a7c4
LW
747 or confess "can't exec fortune: $!";
748 };
a0d0e21e 749
54310121 750 }
a0d0e21e 751
4633a7c4
LW
752 sub spawn {
753 my $coderef = shift;
a0d0e21e 754
54310121 755 unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
4633a7c4 756 confess "usage: spawn CODEREF";
a0d0e21e 757 }
4633a7c4
LW
758
759 my $pid;
760 if (!defined($pid = fork)) {
761 logmsg "cannot fork: $!";
762 return;
763 } elsif ($pid) {
764 logmsg "begat $pid";
6a3992aa 765 return; # I'm the parent
4633a7c4 766 }
6a3992aa 767 # else I'm the child -- go spawn
4633a7c4 768
c07a80fd 769 open(STDIN, "<&Client") || die "can't dup client to stdin";
770 open(STDOUT, ">&Client") || die "can't dup client to stdout";
4633a7c4
LW
771 ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
772 exit &$coderef();
54310121 773 }
4633a7c4
LW
774
775This server takes the trouble to clone off a child version via fork() for
776each incoming request. That way it can handle many requests at once,
777which you might not always want. Even if you don't fork(), the listen()
778will allow that many pending connections. Forking servers have to be
779particularly careful about cleaning up their dead children (called
780"zombies" in Unix parlance), because otherwise you'll quickly fill up your
781process table.
782
783We suggest that you use the B<-T> flag to use taint checking (see L<perlsec>)
784even if we aren't running setuid or setgid. This is always a good idea
785for servers and other programs run on behalf of someone else (like CGI
786scripts), because it lessens the chances that people from the outside will
787be able to compromise your system.
788
789Let's look at another TCP client. This one connects to the TCP "time"
790service on a number of different machines and shows how far their clocks
791differ from the system on which it's being run:
792
793 #!/usr/bin/perl -w
4633a7c4
LW
794 use strict;
795 use Socket;
796
797 my $SECS_of_70_YEARS = 2208988800;
54310121 798 sub ctime { scalar localtime(shift) }
4633a7c4 799
54310121 800 my $iaddr = gethostbyname('localhost');
801 my $proto = getprotobyname('tcp');
802 my $port = getservbyname('time', 'tcp');
4633a7c4
LW
803 my $paddr = sockaddr_in(0, $iaddr);
804 my($host);
805
806 $| = 1;
807 printf "%-24s %8s %s\n", "localhost", 0, ctime(time());
808
809 foreach $host (@ARGV) {
810 printf "%-24s ", $host;
811 my $hisiaddr = inet_aton($host) || die "unknown host";
812 my $hispaddr = sockaddr_in($port, $hisiaddr);
813 socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
814 connect(SOCKET, $hispaddr) || die "bind: $!";
815 my $rtime = ' ';
816 read(SOCKET, $rtime, 4);
817 close(SOCKET);
818 my $histime = unpack("N", $rtime) - $SECS_of_70_YEARS ;
819 printf "%8d %s\n", $histime - time, ctime($histime);
a0d0e21e
LW
820 }
821
4633a7c4
LW
822=head2 Unix-Domain TCP Clients and Servers
823
a2eb9003 824That's fine for Internet-domain clients and servers, but what about local
4633a7c4
LW
825communications? While you can use the same setup, sometimes you don't
826want to. Unix-domain sockets are local to the current host, and are often
54310121 827used internally to implement pipes. Unlike Internet domain sockets, Unix
4633a7c4
LW
828domain sockets can show up in the file system with an ls(1) listing.
829
5a964f20 830 % ls -l /dev/log
4633a7c4 831 srw-rw-rw- 1 root 0 Oct 31 07:23 /dev/log
a0d0e21e 832
4633a7c4
LW
833You can test for these with Perl's B<-S> file test:
834
835 unless ( -S '/dev/log' ) {
836 die "something's wicked with the print system";
54310121 837 }
4633a7c4
LW
838
839Here's a sample Unix-domain client:
840
841 #!/usr/bin/perl -w
4633a7c4
LW
842 use Socket;
843 use strict;
844 my ($rendezvous, $line);
845
846 $rendezvous = shift || '/tmp/catsock';
847 socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!";
9607fc9c 848 connect(SOCK, sockaddr_un($rendezvous)) || die "connect: $!";
54310121 849 while (defined($line = <SOCK>)) {
4633a7c4 850 print $line;
54310121 851 }
4633a7c4
LW
852 exit;
853
5a964f20
TC
854And here's a corresponding server. You don't have to worry about silly
855network terminators here because Unix domain sockets are guaranteed
856to be on the localhost, and thus everything works right.
4633a7c4
LW
857
858 #!/usr/bin/perl -Tw
4633a7c4
LW
859 use strict;
860 use Socket;
861 use Carp;
862
863 BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
5a964f20 864 sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
4633a7c4
LW
865
866 my $NAME = '/tmp/catsock';
867 my $uaddr = sockaddr_un($NAME);
868 my $proto = getprotobyname('tcp');
869
c07a80fd 870 socket(Server,PF_UNIX,SOCK_STREAM,0) || die "socket: $!";
4633a7c4 871 unlink($NAME);
c07a80fd 872 bind (Server, $uaddr) || die "bind: $!";
873 listen(Server,SOMAXCONN) || die "listen: $!";
4633a7c4
LW
874
875 logmsg "server started on $NAME";
876
5a964f20
TC
877 my $waitedpid;
878
879 sub REAPER {
880 $waitedpid = wait;
881 $SIG{CHLD} = \&REAPER; # loathe sysV
882 logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
883 }
884
4633a7c4
LW
885 $SIG{CHLD} = \&REAPER;
886
5a964f20 887
54310121 888 for ( $waitedpid = 0;
889 accept(Client,Server) || $waitedpid;
890 $waitedpid = 0, close Client)
4633a7c4
LW
891 {
892 next if $waitedpid;
893 logmsg "connection on $NAME";
54310121 894 spawn sub {
4633a7c4
LW
895 print "Hello there, it's now ", scalar localtime, "\n";
896 exec '/usr/games/fortune' or die "can't exec fortune: $!";
897 };
54310121 898 }
4633a7c4
LW
899
900As you see, it's remarkably similar to the Internet domain TCP server, so
901much so, in fact, that we've omitted several duplicate functions--spawn(),
902logmsg(), ctime(), and REAPER()--which are exactly the same as in the
903other server.
904
905So why would you ever want to use a Unix domain socket instead of a
906simpler named pipe? Because a named pipe doesn't give you sessions. You
907can't tell one process's data from another's. With socket programming,
908you get a separate session for each client: that's why accept() takes two
909arguments.
910
911For example, let's say that you have a long running database server daemon
912that you want folks from the World Wide Web to be able to access, but only
913if they go through a CGI interface. You'd have a small, simple CGI
914program that does whatever checks and logging you feel like, and then acts
915as a Unix-domain client and connects to your private server.
916
7b05b7e3
TC
917=head1 TCP Clients with IO::Socket
918
919For those preferring a higher-level interface to socket programming, the
920IO::Socket module provides an object-oriented approach. IO::Socket is
921included as part of the standard Perl distribution as of the 5.004
922release. If you're running an earlier version of Perl, just fetch
923IO::Socket from CPAN, where you'll also find find modules providing easy
924interfaces to the following systems: DNS, FTP, Ident (RFC 931), NIS and
925NISPlus, NNTP, Ping, POP3, SMTP, SNMP, SSLeay, Telnet, and Time--just
926to name a few.
927
928=head2 A Simple Client
929
930Here's a client that creates a TCP connection to the "daytime"
931service at port 13 of the host name "localhost" and prints out everything
932that the server there cares to provide.
933
934 #!/usr/bin/perl -w
935 use IO::Socket;
936 $remote = IO::Socket::INET->new(
937 Proto => "tcp",
938 PeerAddr => "localhost",
939 PeerPort => "daytime(13)",
940 )
941 or die "cannot connect to daytime port at localhost";
942 while ( <$remote> ) { print }
943
944When you run this program, you should get something back that
945looks like this:
946
947 Wed May 14 08:40:46 MDT 1997
948
949Here are what those parameters to the C<new> constructor mean:
950
951=over
952
953=item C<Proto>
954
955This is which protocol to use. In this case, the socket handle returned
956will be connected to a TCP socket, because we want a stream-oriented
957connection, that is, one that acts pretty much like a plain old file.
958Not all sockets are this of this type. For example, the UDP protocol
959can be used to make a datagram socket, used for message-passing.
960
961=item C<PeerAddr>
962
963This is the name or Internet address of the remote host the server is
964running on. We could have specified a longer name like C<"www.perl.com">,
965or an address like C<"204.148.40.9">. For demonstration purposes, we've
966used the special hostname C<"localhost">, which should always mean the
967current machine you're running on. The corresponding Internet address
968for localhost is C<"127.1">, if you'd rather use that.
969
970=item C<PeerPort>
971
972This is the service name or port number we'd like to connect to.
973We could have gotten away with using just C<"daytime"> on systems with a
974well-configured system services file,[FOOTNOTE: The system services file
975is in I</etc/services> under Unix] but just in case, we've specified the
976port number (13) in parentheses. Using just the number would also have
977worked, but constant numbers make careful programmers nervous.
978
979=back
980
981Notice how the return value from the C<new> constructor is used as
982a filehandle in the C<while> loop? That's what's called an indirect
983filehandle, a scalar variable containing a filehandle. You can use
984it the same way you would a normal filehandle. For example, you
985can read one line from it this way:
986
987 $line = <$handle>;
988
989all remaining lines from is this way:
990
991 @lines = <$handle>;
992
993and send a line of data to it this way:
994
995 print $handle "some data\n";
996
997=head2 A Webget Client
998
999Here's a simple client that takes a remote host to fetch a document
1000from, and then a list of documents to get from that host. This is a
1001more interesting client than the previous one because it first sends
1002something to the server before fetching the server's response.
1003
1004 #!/usr/bin/perl -w
1005 use IO::Socket;
1006 unless (@ARGV > 1) { die "usage: $0 host document ..." }
1007 $host = shift(@ARGV);
5a964f20
TC
1008 $EOL = "\015\012";
1009 $BLANK = $EOL x 2;
7b05b7e3
TC
1010 foreach $document ( @ARGV ) {
1011 $remote = IO::Socket::INET->new( Proto => "tcp",
1012 PeerAddr => $host,
1013 PeerPort => "http(80)",
1014 );
1015 unless ($remote) { die "cannot connect to http daemon on $host" }
1016 $remote->autoflush(1);
5a964f20 1017 print $remote "GET $document HTTP/1.0" . $BLANK;
7b05b7e3
TC
1018 while ( <$remote> ) { print }
1019 close $remote;
1020 }
1021
1022The web server handing the "http" service, which is assumed to be at
1023its standard port, number 80. If your the web server you're trying to
1024connect to is at a different port (like 1080 or 8080), you should specify
1025as the named-parameter pair, C<PeerPort =E<gt> 8080>. The C<autoflush>
1026method is used on the socket because otherwise the system would buffer
1027up the output we sent it. (If you're on a Mac, you'll also need to
1028change every C<"\n"> in your code that sends data over the network to
1029be a C<"\015\012"> instead.)
1030
1031Connecting to the server is only the first part of the process: once you
1032have the connection, you have to use the server's language. Each server
1033on the network has its own little command language that it expects as
1034input. The string that we send to the server starting with "GET" is in
1035HTTP syntax. In this case, we simply request each specified document.
1036Yes, we really are making a new connection for each document, even though
1037it's the same host. That's the way you always used to have to speak HTTP.
1038Recent versions of web browsers may request that the remote server leave
1039the connection open a little while, but the server doesn't have to honor
1040such a request.
1041
1042Here's an example of running that program, which we'll call I<webget>:
1043
5a964f20 1044 % webget www.perl.com /guanaco.html
7b05b7e3
TC
1045 HTTP/1.1 404 File Not Found
1046 Date: Thu, 08 May 1997 18:02:32 GMT
1047 Server: Apache/1.2b6
1048 Connection: close
1049 Content-type: text/html
1050
1051 <HEAD><TITLE>404 File Not Found</TITLE></HEAD>
1052 <BODY><H1>File Not Found</H1>
1053 The requested URL /guanaco.html was not found on this server.<P>
1054 </BODY>
1055
1056Ok, so that's not very interesting, because it didn't find that
1057particular document. But a long response wouldn't have fit on this page.
1058
1059For a more fully-featured version of this program, you should look to
1060the I<lwp-request> program included with the LWP modules from CPAN.
1061
1062=head2 Interactive Client with IO::Socket
1063
1064Well, that's all fine if you want to send one command and get one answer,
1065but what about setting up something fully interactive, somewhat like
1066the way I<telnet> works? That way you can type a line, get the answer,
1067type a line, get the answer, etc.
1068
1069This client is more complicated than the two we've done so far, but if
1070you're on a system that supports the powerful C<fork> call, the solution
1071isn't that rough. Once you've made the connection to whatever service
1072you'd like to chat with, call C<fork> to clone your process. Each of
1073these two identical process has a very simple job to do: the parent
1074copies everything from the socket to standard output, while the child
1075simultaneously copies everything from standard input to the socket.
1076To accomplish the same thing using just one process would be I<much>
1077harder, because it's easier to code two processes to do one thing than it
1078is to code one process to do two things. (This keep-it-simple principle
5a964f20
TC
1079a cornerstones of the Unix philosophy, and good software engineering as
1080well, which is probably why it's spread to other systems.)
7b05b7e3
TC
1081
1082Here's the code:
1083
1084 #!/usr/bin/perl -w
1085 use strict;
1086 use IO::Socket;
1087 my ($host, $port, $kidpid, $handle, $line);
1088
1089 unless (@ARGV == 2) { die "usage: $0 host port" }
1090 ($host, $port) = @ARGV;
1091
1092 # create a tcp connection to the specified host and port
1093 $handle = IO::Socket::INET->new(Proto => "tcp",
1094 PeerAddr => $host,
1095 PeerPort => $port)
1096 or die "can't connect to port $port on $host: $!";
1097
1098 $handle->autoflush(1); # so output gets there right away
1099 print STDERR "[Connected to $host:$port]\n";
1100
1101 # split the program into two processes, identical twins
1102 die "can't fork: $!" unless defined($kidpid = fork());
1103
1104 # the if{} block runs only in the parent process
1105 if ($kidpid) {
1106 # copy the socket to standard output
1107 while (defined ($line = <$handle>)) {
1108 print STDOUT $line;
1109 }
1110 kill("TERM", $kidpid); # send SIGTERM to child
1111 }
1112 # the else{} block runs only in the child process
1113 else {
1114 # copy standard input to the socket
1115 while (defined ($line = <STDIN>)) {
1116 print $handle $line;
1117 }
1118 }
1119
1120The C<kill> function in the parent's C<if> block is there to send a
1121signal to our child process (current running in the C<else> block)
1122as soon as the remote server has closed its end of the connection.
1123
7b05b7e3
TC
1124If the remote server sends data a byte at time, and you need that
1125data immediately without waiting for a newline (which might not happen),
1126you may wish to replace the C<while> loop in the parent with the
1127following:
1128
1129 my $byte;
1130 while (sysread($handle, $byte, 1) == 1) {
1131 print STDOUT $byte;
1132 }
1133
1134Making a system call for each byte you want to read is not very efficient
1135(to put it mildly) but is the simplest to explain and works reasonably
1136well.
1137
1138=head1 TCP Servers with IO::Socket
1139
5a964f20 1140As always, setting up a server is little bit more involved than running a client.
7b05b7e3
TC
1141The model is that the server creates a special kind of socket that
1142does nothing but listen on a particular port for incoming connections.
1143It does this by calling the C<IO::Socket::INET-E<gt>new()> method with
1144slightly different arguments than the client did.
1145
1146=over
1147
1148=item Proto
1149
1150This is which protocol to use. Like our clients, we'll
1151still specify C<"tcp"> here.
1152
1153=item LocalPort
1154
1155We specify a local
1156port in the C<LocalPort> argument, which we didn't do for the client.
1157This is service name or port number for which you want to be the
1158server. (Under Unix, ports under 1024 are restricted to the
1159superuser.) In our sample, we'll use port 9000, but you can use
1160any port that's not currently in use on your system. If you try
1161to use one already in used, you'll get an "Address already in use"
1162message. Under Unix, the C<netstat -a> command will show
1163which services current have servers.
1164
1165=item Listen
1166
1167The C<Listen> parameter is set to the maximum number of
1168pending connections we can accept until we turn away incoming clients.
1169Think of it as a call-waiting queue for your telephone.
1170The low-level Socket module has a special symbol for the system maximum, which
1171is SOMAXCONN.
1172
1173=item Reuse
1174
1175The C<Reuse> parameter is needed so that we restart our server
1176manually without waiting a few minutes to allow system buffers to
1177clear out.
1178
1179=back
1180
1181Once the generic server socket has been created using the parameters
1182listed above, the server then waits for a new client to connect
1183to it. The server blocks in the C<accept> method, which eventually an
1184bidirectional connection to the remote client. (Make sure to autoflush
1185this handle to circumvent buffering.)
1186
1187To add to user-friendliness, our server prompts the user for commands.
1188Most servers don't do this. Because of the prompt without a newline,
1189you'll have to use the C<sysread> variant of the interactive client above.
1190
1191This server accepts one of five different commands, sending output
1192back to the client. Note that unlike most network servers, this one
1193only handles one incoming client at a time. Multithreaded servers are
7b8d334a 1194covered in Chapter 6 of the Camel as well as later in this manpage.
7b05b7e3
TC
1195
1196Here's the code. We'll
1197
1198 #!/usr/bin/perl -w
1199 use IO::Socket;
1200 use Net::hostent; # for OO version of gethostbyaddr
1201
1202 $PORT = 9000; # pick something not in use
1203
1204 $server = IO::Socket::INET->new( Proto => 'tcp',
1205 LocalPort => $PORT,
1206 Listen => SOMAXCONN,
1207 Reuse => 1);
1208
1209 die "can't setup server" unless $server;
1210 print "[Server $0 accepting clients]\n";
1211
1212 while ($client = $server->accept()) {
1213 $client->autoflush(1);
1214 print $client "Welcome to $0; type help for command list.\n";
1215 $hostinfo = gethostbyaddr($client->peeraddr);
1216 printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost;
1217 print $client "Command? ";
1218 while ( <$client>) {
1219 next unless /\S/; # blank line
1220 if (/quit|exit/i) { last; }
1221 elsif (/date|time/i) { printf $client "%s\n", scalar localtime; }
1222 elsif (/who/i ) { print $client `who 2>&1`; }
1223 elsif (/cookie/i ) { print $client `/usr/games/fortune 2>&1`; }
1224 elsif (/motd/i ) { print $client `cat /etc/motd 2>&1`; }
1225 else {
1226 print $client "Commands: quit date who cookie motd\n";
1227 }
1228 } continue {
1229 print $client "Command? ";
1230 }
1231 close $client;
1232 }
1233
1234=head1 UDP: Message Passing
4633a7c4
LW
1235
1236Another kind of client-server setup is one that uses not connections, but
1237messages. UDP communications involve much lower overhead but also provide
1238less reliability, as there are no promises that messages will arrive at
1239all, let alone in order and unmangled. Still, UDP offers some advantages
1240over TCP, including being able to "broadcast" or "multicast" to a whole
1241bunch of destination hosts at once (usually on your local subnet). If you
1242find yourself overly concerned about reliability and start building checks
6a3992aa 1243into your message system, then you probably should use just TCP to start
4633a7c4
LW
1244with.
1245
1246Here's a UDP program similar to the sample Internet TCP client given
7b05b7e3 1247earlier. However, instead of checking one host at a time, the UDP version
4633a7c4
LW
1248will check many of them asynchronously by simulating a multicast and then
1249using select() to do a timed-out wait for I/O. To do something similar
1250with TCP, you'd have to use a different socket handle for each host.
1251
1252 #!/usr/bin/perl -w
1253 use strict;
4633a7c4
LW
1254 use Socket;
1255 use Sys::Hostname;
1256
54310121 1257 my ( $count, $hisiaddr, $hispaddr, $histime,
1258 $host, $iaddr, $paddr, $port, $proto,
4633a7c4
LW
1259 $rin, $rout, $rtime, $SECS_of_70_YEARS);
1260
1261 $SECS_of_70_YEARS = 2208988800;
1262
1263 $iaddr = gethostbyname(hostname());
1264 $proto = getprotobyname('udp');
1265 $port = getservbyname('time', 'udp');
1266 $paddr = sockaddr_in(0, $iaddr); # 0 means let kernel pick
1267
1268 socket(SOCKET, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
1269 bind(SOCKET, $paddr) || die "bind: $!";
1270
1271 $| = 1;
1272 printf "%-12s %8s %s\n", "localhost", 0, scalar localtime time;
1273 $count = 0;
1274 for $host (@ARGV) {
1275 $count++;
1276 $hisiaddr = inet_aton($host) || die "unknown host";
1277 $hispaddr = sockaddr_in($port, $hisiaddr);
1278 defined(send(SOCKET, 0, 0, $hispaddr)) || die "send $host: $!";
1279 }
1280
1281 $rin = '';
1282 vec($rin, fileno(SOCKET), 1) = 1;
1283
1284 # timeout after 10.0 seconds
1285 while ($count && select($rout = $rin, undef, undef, 10.0)) {
1286 $rtime = '';
1287 ($hispaddr = recv(SOCKET, $rtime, 4, 0)) || die "recv: $!";
1288 ($port, $hisiaddr) = sockaddr_in($hispaddr);
1289 $host = gethostbyaddr($hisiaddr, AF_INET);
1290 $histime = unpack("N", $rtime) - $SECS_of_70_YEARS ;
1291 printf "%-12s ", $host;
1292 printf "%8d %s\n", $histime - time, scalar localtime($histime);
1293 $count--;
1294 }
1295
1296=head1 SysV IPC
1297
1298While System V IPC isn't so widely used as sockets, it still has some
1299interesting uses. You can't, however, effectively use SysV IPC or
1300Berkeley mmap() to have shared memory so as to share a variable amongst
1301several processes. That's because Perl would reallocate your string when
1302you weren't wanting it to.
1303
54310121 1304Here's a small example showing shared memory usage.
a0d0e21e 1305
0ade1984
JH
1306 use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRWXU S_IRWXG S_IRWXO);
1307
a0d0e21e 1308 $size = 2000;
0ade1984
JH
1309 $key = shmget(IPC_PRIVATE, $size, S_IRWXU|S_IRWXG|S_IRWXO) || die "$!";
1310 print "shm key $key\n";
a0d0e21e
LW
1311
1312 $message = "Message #1";
0ade1984
JH
1313 shmwrite($key, $message, 0, 60) || die "$!";
1314 print "wrote: '$message'\n";
1315 shmread($key, $buff, 0, 60) || die "$!";
1316 print "read : '$buff'\n";
a0d0e21e 1317
0ade1984
JH
1318 # the buffer of shmread is zero-character end-padded.
1319 substr($buff, index($buff, "\0")) = '';
1320 print "un" unless $buff eq $message;
1321 print "swell\n";
a0d0e21e 1322
0ade1984
JH
1323 print "deleting shm $key\n";
1324 shmctl($key, IPC_RMID, 0) || die "$!";
a0d0e21e
LW
1325
1326Here's an example of a semaphore:
1327
0ade1984
JH
1328 use IPC::SysV qw(IPC_CREAT);
1329
a0d0e21e 1330 $IPC_KEY = 1234;
0ade1984
JH
1331 $key = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!";
1332 print "shm key $key\n";
a0d0e21e 1333
a2eb9003 1334Put this code in a separate file to be run in more than one process.
a0d0e21e
LW
1335Call the file F<take>:
1336
1337 # create a semaphore
1338
1339 $IPC_KEY = 1234;
1340 $key = semget($IPC_KEY, 0 , 0 );
1341 die if !defined($key);
1342
1343 $semnum = 0;
1344 $semflag = 0;
1345
1346 # 'take' semaphore
1347 # wait for semaphore to be zero
1348 $semop = 0;
1349 $opstring1 = pack("sss", $semnum, $semop, $semflag);
1350
1351 # Increment the semaphore count
1352 $semop = 1;
1353 $opstring2 = pack("sss", $semnum, $semop, $semflag);
1354 $opstring = $opstring1 . $opstring2;
1355
1356 semop($key,$opstring) || die "$!";
1357
a2eb9003 1358Put this code in a separate file to be run in more than one process.
a0d0e21e
LW
1359Call this file F<give>:
1360
4633a7c4 1361 # 'give' the semaphore
a0d0e21e
LW
1362 # run this in the original process and you will see
1363 # that the second process continues
1364
1365 $IPC_KEY = 1234;
1366 $key = semget($IPC_KEY, 0, 0);
1367 die if !defined($key);
1368
1369 $semnum = 0;
1370 $semflag = 0;
1371
1372 # Decrement the semaphore count
1373 $semop = -1;
1374 $opstring = pack("sss", $semnum, $semop, $semflag);
1375
1376 semop($key,$opstring) || die "$!";
1377
7b05b7e3 1378The SysV IPC code above was written long ago, and it's definitely
0ade1984
JH
1379clunky looking. For a more modern look, see the IPC::SysV module
1380which is included with Perl starting from Perl 5.005.
4633a7c4
LW
1381
1382=head1 NOTES
1383
5a964f20
TC
1384Most of these routines quietly but politely return C<undef> when they
1385fail instead of causing your program to die right then and there due to
1386an uncaught exception. (Actually, some of the new I<Socket> conversion
1387functions croak() on bad arguments.) It is therefore essential to
1388check return values from these functions. Always begin your socket
1389programs this way for optimal success, and don't forget to add B<-T>
1390taint checking flag to the #! line for servers:
4633a7c4 1391
5a964f20 1392 #!/usr/bin/perl -Tw
4633a7c4
LW
1393 use strict;
1394 use sigtrap;
1395 use Socket;
1396
1397=head1 BUGS
1398
1399All these routines create system-specific portability problems. As noted
1400elsewhere, Perl is at the mercy of your C libraries for much of its system
1401behaviour. It's probably safest to assume broken SysV semantics for
6a3992aa 1402signals and to stick with simple TCP and UDP socket operations; e.g., don't
a2eb9003 1403try to pass open file descriptors over a local UDP datagram socket if you
4633a7c4
LW
1404want your code to stand a chance of being portable.
1405
5a964f20
TC
1406As mentioned in the signals section, because few vendors provide C
1407libraries that are safely re-entrant, the prudent programmer will do
1408little else within a handler beyond setting a numeric variable that
1409already exists; or, if locked into a slow (restarting) system call,
1410using die() to raise an exception and longjmp(3) out. In fact, even
1411these may in some cases cause a core dump. It's probably best to avoid
1412signals except where they are absolutely inevitable. This
1413will be addressed in a future release of Perl.
4633a7c4
LW
1414
1415=head1 AUTHOR
1416
1417Tom Christiansen, with occasional vestiges of Larry Wall's original
7b05b7e3 1418version and suggestions from the Perl Porters.
4633a7c4
LW
1419
1420=head1 SEE ALSO
1421
7b05b7e3
TC
1422There's a lot more to networking than this, but this should get you
1423started.
1424
5a964f20
TC
1425For intrepid programmers, the indispensable textbook is I<Unix Network
1426Programming> by W. Richard Stevens (published by Addison-Wesley). Note
1427that most books on networking address networking from the perspective of
1428a C programmer; translation to Perl is left as an exercise for the reader.
7b05b7e3
TC
1429
1430The IO::Socket(3) manpage describes the object library, and the Socket(3)
1431manpage describes the low-level interface to sockets. Besides the obvious
1432functions in L<perlfunc>, you should also check out the F<modules> file
1433at your nearest CPAN site. (See L<perlmodlib> or best yet, the F<Perl
1434FAQ> for a description of what CPAN is and where to get it.)
1435
4633a7c4 1436Section 5 of the F<modules> file is devoted to "Networking, Device Control
6a3992aa 1437(modems), and Interprocess Communication", and contains numerous unbundled
4633a7c4
LW
1438modules numerous networking modules, Chat and Expect operations, CGI
1439programming, DCE, FTP, IPC, NNTP, Proxy, Ptty, RPC, SNMP, SMTP, Telnet,
1440Threads, and ToolTalk--just to name a few.