/* * This program creates a socket in the UNIX domain and binds a * name to it. After printing the socket's name, a loop begins. * Each time through the loop it accepts a connection and prints * out messages from it. When the connection breaks, or a * termination message comes through, the program accepts a new * connection. */ #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #define NAME "socket" main() { int sock, msgsock, rval; struct sockaddr_un server; char buf[1024]; /* Create socket. */ sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); exit(1); } /* Name socket using file system name. */ server.sun_family = AF_UNIX; strcpy(server.sun_path, NAME); server.sun_len = strlen(server.sun_path); if (bind(sock, (struct sockaddr *)&server, SUN_LEN(&server))) { perror("binding stream socket"); exit(1); }
printf("Socket has name %s\n", server.sun_path); /* Start accepting connections. */ listen(sock, 5); for (;;) {
msgsock = accept(sock, 0, 0); if (msgsock == -1) perror("accept"); else do { bzero(buf, sizeof(buf)); if ((rval = read(msgsock, buf, 1024)) < 0) perror("reading stream message"); else if (rval == 0) printf("Ending connection\n"); else printf("-->%s\n", buf); } while (rval > 0); close(msgsock); }
/* The following statements are not executed, because they * follow an infinite loop. However, most ordinary programs * will not run forever. In the UNIX domain it is necessary to * tell the file system that you are through using NAME. In * most programs you use the call unlink() as below. Since * the user will have to kill this program, it will be * necessary to remove the name with a shell command. */ close(sock); unlink(NAME); }