1 /* 2 * Copyright (c) 1986 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 char copyright[] = 20 "@(#) Copyright (c) 1986 The Regents of the University of California.\n\ 21 All rights reserved.\n"; 22 #endif /* not lint */ 23 24 #ifndef lint 25 static char sccsid[] = "@(#)socketpair.c 6.3 (Berkeley) 03/07/89"; 26 #endif /* not lint */ 27 28 #include <sys/types.h> 29 #include <sys/socket.h> 30 #include <stdio.h> 31 32 #define DATA1 "In Xanadu, did Kublai Khan . . ." 33 #define DATA2 "A stately pleasure dome decree . . ." 34 35 /* 36 * This program creates a pair of connected sockets then forks and 37 * communicates over them. This is very similar to communication with pipes, 38 * however, socketpairs are two-way communications objects. Therefore I can 39 * send messages in both directions. 40 */ 41 42 main() 43 { 44 int sockets[2], child; 45 char buf[1024]; 46 47 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) { 48 perror("opening stream socket pair"); 49 exit(1); 50 } 51 52 if ((child = fork()) == -1) 53 perror("fork"); 54 else if (child) { /* This is the parent. */ 55 close(sockets[0]); 56 if (read(sockets[1], buf, 1024, 0) < 0) 57 perror("reading stream message"); 58 printf("-->%s\en", buf); 59 if (write(sockets[1], DATA2, sizeof(DATA2)) < 0) 60 perror("writing stream message"); 61 close(sockets[1]); 62 } else { /* This is the child. */ 63 close(sockets[1]); 64 if (write(sockets[0], DATA1, sizeof(DATA1)) < 0) 65 perror("writing stream message"); 66 if (read(sockets[0], buf, 1024, 0) < 0) 67 perror("reading stream message"); 68 printf("-->%s\en", buf); 69 close(sockets[0]); 70 } 71 } 72