|
|
Unlike the previous examples, which dealt with streams sockets, the following two sample programs send and receive data on datagram sockets. These examples are for the UNIX domain; for the Internet domain equivalents, see ``Datagrams in the Internet Domain''.
First, create a server that can receive UNIX domain datagrams:
Reading UNIX domain datagrams
#include <sys/types.h> #include <sys/socket.h> #include <sys/un.h>The following sample code creates a client and sends datagrams to a server like the one created in the previous example. For the Internet domain equivalent example, see `` Sending an Internet domain datagram''./* * In the included file <sys/un.h> a sockaddr_un is defined as follows * struct sockaddr_un { * short sun_family; * char sun_path[108]; * }; */
#include <stdio.h>
#define NAME "socket"
/* * This program creates a UNIX domain datagram socket, binds a name to it, * then reads from the socket. */ main() { int sock, length; struct sockaddr_un name; char buf[1024];
/* Create socket from which to read. */ sock = socket(AF_UNIX, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); }
/* Create name. */ name.sun_family = AF_UNIX; strcpy(name.sun_path, NAME);
/* Bind the UNIX domain address to the created socket */ if (bind(sock, (struct sockaddr *) &name, sizeof(struct sockaddr_un))) { perror("binding name to datagram socket"); exit(1); } printf("socket -->%s\n", NAME);
/* Read from the socket */ if (read(sock, buf, 1024) < 0) perror("receiving datagram packet"); printf("-->%s\n", buf); close(sock); unlink(NAME); }
Sending UNIX domain datagrams
#include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h>#define DATA "The sea is calm tonight, the tide is full . . ."
/* * Send a datagram to a receiver whose name is specified in the command * line arguments. The form of the command line is <programname> <pathname> */
main(argc, argv) int argc; char *argv[]; { int sock; struct sockaddr_un name;
/* Create socket on which to send. */ sock = socket(AF_UNIX, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); } /* Construct name of socket to send to. */ name.sun_family = AF_UNIX; strcpy(name.sun_path, argv[1]); /* Send message. */ if (sendto(sock, DATA, sizeof(DATA), 0, &name, sizeof(struct sockaddr_un)) < 0) { perror("sending datagram message"); } close(sock); }